使用 rsnapshot 備份 MySQL 數據庫的正確方法是什麼?
我想備份我的網站,其中包含使用者上傳的圖像和儲存在 MySQL 數據庫中的數據,以便它們在任何特定時間點始終彼此一致。在尋找解決方案時,我發現這個應用程序 rsnapshot 可能適合該任務。瀏覽了網際網路上的一些部落格後,我意識到這實際上是通過使用 mysqldump 方法的 backup_script 完成的:
backup_script ssh root@example.com "mysqldump -A > /var/db/dump/mysql.sql" unused2 backup root@example.com:/var/db/dump/ example.com/
我不確定是否有必要在腳本中執行轉儲之前用讀鎖刷新所有表以確保數據庫的一致性。如果是這樣,應該如何納入?如果沒有,為什麼沒有必要?
預設情況下,您的使用
mysqldump
將在轉儲每個表時鎖定每個表,並且表之間不會有任何一致性。您也不會備份任何觸發器、儲存過程、儲存函式或事件,並且如果您的任何視圖定義無效(引用自定義視圖以來您可能已刪除或重命名的不存在的表或列),轉儲遇到該錯誤時,程序將終止。如果您所有的表都是 InnoDB,您可以通過添加以下內容來獲得一致的快照:
--single-transaction
此選項禁用預設值,該預設值
--lock-tables
在轉儲時鎖定每個表,然後在轉儲完成時將其解鎖,而是在轉儲開始時向伺服器發出以下語句(您可以通過啟用通用查詢日誌來觀察):SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION WITH CONSISTENT SNAPSHOT;
當然,這只對 InnoDB 有幫助。如果您的表是 MyISAM 或任何其他非事務性引擎,您只有一個選擇:
--lock-all-tables
…鎖定整個轉儲的所有表,因為這是在沒有事務協助的情況下確保一致性的唯一方法。
要備份您的儲存過程、事件和触發器,請添加:
--routines --events --triggers
防止
mysqldump
在存在無效視圖定義時失敗--force
要擷取您的 binlog 位置並將其儲存在備份文件中,請添加:
--master-data=2
如果您的機器不是從機,則此選項不起作用。
您的問題是關於“使用 rsnapshot”備份數據庫,儘管為了說明這一點,您建議使用 mysqldump 備份數據庫,然後使用 rsnapshot 備份轉儲文件……從簡單的外觀很難判斷在他們的網站上這是否是一個不錯的選擇,因為 rsnapshot 似乎具有文件級粒度。它似乎不儲存差異,而是儲存在備份週期之間更改的“每個”文件的完整文件:
“所需的空間量大約是一個完整備份的大小,加上每個更改的附加文件的副本。” – http://www.rsnapshot.org/rsnapshot.html
如果我在這一點上錯了,我歡迎指正。在這種情況下,您只有 1 個文件,即來自 mysqldump 的轉儲文件,當然每次都會更改。
無論您做什麼,都不要考慮嘗試備份 MySQL 中表的實際文件(.frm、.ibd、.MYD 等)。即使在極少數情況下,您可能會獲得看似完整的備份,但這不適用於正在執行的伺服器。它不是。
更新:
mylvmbackup所做的和“備份實際文件”之間有一個重要的區別。要使用 mylvmbackup,您必須使用LVM,它可以視覺化為文件系統和硬碟驅動器之間的抽象層。使用 LVM,您可以凍結文件系統並製作整個文件系統的時間點快照。
看起來 mylvmbackup在查找複製座標(如果在配置中指定)之前正在執行 a ,這與 mysqldump 在使用和同時使用時執行的
FLUSH TABLES
過程相同。這穩定了 MySQL,但它並沒有完全停止 InnoDB,所以當這樣的備份被恢復時,InnoDB 會認為它崩潰並會進行崩潰恢復……但它應該是一個乾淨的恢復。FLUSH TABLES WITH READ LOCK``--single-transaction``--master-data
如果您的網站的數據文件在同一個文件系統中,那麼 LVM 快照將包含與單個時間點一致的所有內容,但是將您的其他網站文件與數據庫放在同一個文件系統中是否是一種好習慣(如果確實在執行您在同一台伺服器上的 Web 伺服器是很好的做法)是另一個討論。
無論採用哪種方法,在任何備份策略中,定期驗證您的備份是否可以實際恢復(在不同的機器上)都是至關重要的。真正最安全的方法是確保
innodb_fast_shutdown
= 0 並實際關閉 MySQL,但這可能不切實際。當然,如果你想使用 rsnapshot 之類的東西,你總是可以對網站文件進行快照,然後對數據庫進行快照,然後再次對網站文件進行快照。如果在備份數據庫時站點文件沒有任何變化,則 rsnapshot 將在第二次執行時使用很少的空間。如果事情確實發生了變化,那麼如果您需要恢復,了解這些差異應該是相當簡單的。