使用 InnoDB 和 MyISAM 表創建一致 線上 MySQL 備份
我只是花了幾個小時建構一個新的數據庫伺服器,以從
mysqldump
一個月前創建的文件中替換 2 個失敗的伺服器,然後使用我伺服器的 bin-logs 來mysqldump
更新它。現在我有了這個新的數據庫伺服器,並且已經執行了幾天,我需要完成伺服器設置並重新實施備份策略。我需要(至少)為新伺服器上線一個 MySQL Replication Slave,並開始創建可用的備份,以備再次失敗時使用。
在我進一步移動之前:
- 在導入舊的邏輯備份並執行舊的 bin 日誌之前,我忘記(eep)在新的 MySQL 伺服器上啟用 bin-log(我猜是因為當時 24 小時都處於清醒狀態)。
- 我的數據由幾個數據庫組成,所有這些數據庫都混合了 MyISAM 表和 InnoDB 表。
- 此外,與在新伺服器上啟用 bin 日誌相同,我忘記在導入所有數據之前打開
innodb-file-per-table
選項。my.cnf
現在在新的 MySQL 伺服器上啟用了二進制日誌,但是在我可以導入另一個邏輯備份之前,每個表的 inno 文件選項幾乎是不可修復的(我可能最終會啟動第二個從站,並提升第一個從站掌握並放棄目前的主人 - 因為配置不是我需要的地方)。所以,問題:
我需要備份 MySQL 伺服器,但我不能讓新的 MySQL 伺服器離線。我需要繼續進行寫入,並在幾乎沒有停機時間的情況下提供讀取服務。這種“幾乎沒有停機時間”的要求被定義為少於 10 分鐘。我的數據目前在伺服器上使用了大約 100GB 的空間(mysql 數據文件),邏輯備份大約是 50GB(這是很多索引..哈哈)。我不在乎這個備份是合乎邏輯的,還是來自 MySQL 數據目錄的數據文件的副本。我可以在從機聯機後創建邏輯備份。
而且,問題是:
您將如何創建所需的備份?我知道這不容易,很多人會說這不可能。但我拒絕相信這是不可能的,必須有辦法完成它。
*關於伺服器的說明:*它執行的是 Ubuntu 10.04、MySQL 5.1.41,並且儲存數據的文件系統是 ext3。伺服器在 Rackspace 雲上執行,因此文件系統幾乎“就是它的樣子”,除非我可以重新分區根設備並用另一個 FS(可能是 XFS?)重新分區以進行快照。
我讀過Perconas XtraBackup Tool但它只適用於 InnoDB 表。他們有一個 MyISAM 工具,但我真的不明白它如何(或者即使它確實)與 XtraBackup 一起工作以創建完全一致的備份。
我讀過
mysqlhotcopy
但它只適用於 MyISAM 表。顯然我知道
mysqldump
,但是(同樣,很明顯)這裡的問題是創建一致的備份,而不會在輸出整個 sql 備份文件所需的小時數內鎖定整個數據庫伺服器。
關於 XtraBackup,或者更具體地說是 innobackupex,請查看此說明
摘抄:
innobackupex 程序還允許您備份 MyISAM 表和 .frm 文件,從而增加了更多便利和功能。它啟動 xtrabackup,等到它完成文件複製,然後發出 FLUSH TABLES WITH READ LOCK 以防止對 MySQL 數據的進一步更改並將所有 MyISAM 表刷新到磁碟。它持有這個鎖,複製 MyISAM 文件,然後釋放鎖。
備份的 MyISAM 和 InnoDB 表最終會相互一致,因為在準備(恢復)過程之後,InnoDB 的數據會前滾到備份完成的點,而不是回滾到它開始的點。這個時間點與 FLUSH TABLES WITH READ LOCK 的位置相匹配,因此 MyISAM 數據和準備好的 InnoDB 數據是同步的。
希望這可以幫助。
乾杯