Mysql

通過 ZFS 快照備份 MySQL 數據庫

  • July 26, 2020

我發現許多網站都在談論這樣做,但我錯過了一些重要的細節。一般步驟是

  • 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 可以從事務送出日誌中恢復數據而不會失去數據。

參考:https ://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

引用自:https://serverfault.com/questions/805257