Mysql
通過 ZFS 快照備份 MySQL 數據庫
我發現許多網站都在談論這樣做,但我錯過了一些重要的細節。一般步驟是
- 跑
FLUSH TABLES WITH READ LOCK
- 拍攝 ZFS 快照
- 跑
UNLOCK TABLES
各種消息來源報告說,我正在使用的 InnoDB 實際上並不支持
FLUSH
. MySQL 使用者手冊指出有一個FLUSH TABLES...FOR EXPORT
用於 InnoDB 的變體,但這需要單獨指定每個表,而不是備份整個數據庫。我寧願避免單獨指定每個表,因為表列表很有可能與實際存在的表不同步。我遇到的另一個問題是我計劃做類似的事情
mysql -h"$HOST" -u"$USERNAME" -p"$PASSWORD" --execute="FLUSH TABLES WITH READ LOCK"
。但是,這會在會話退出後立即解除鎖定。這是有道理的,但也很煩人,因為我在拍攝快照時需要持有讀鎖。我的另一個想法是使用 Percona XtraBackup 之類的工具進行熱備份並拍攝備份快照,但我不想支付將所有數據寫入第二個位置的成本,只是為了對其進行快照。
如果您只對所有表使用 InnoDB 並設置
innodb_flush_log_at_trx_commit
為:
1
(InnoDB 日誌緩衝區的內容在每次事務送出時被寫入日誌文件,並且日誌文件被刷新到磁碟)或者,2
(InnoDB 日誌緩衝區的內容在每次事務送出後寫入日誌文件,並且日誌文件大約每秒刷新一次到磁碟),那麼在做快照之前你不需要 FLUSH TABLES,直接執行 ZFS 快照。InnoDB 可以從事務送出日誌中恢復數據而不會失去數據。