當被問及 MySQL 備份建議時,我的第一個問題通常是:「你的系統是否啟用了 LVM 或具備類似快照能力的存儲(如 Solaris Veritas FS、各類 SAN)?」
核心需求是對數據卷創建原子級一致性快照,且該快照可像原文件系統一樣掛載讀寫。基於快照的備份優勢顯著:
FLUSH TABLES WITH READ LOCK)。FLUSH TABLES WITH READ LOCK 持續較久。純 InnoDB 且不需 binlog 位點同步時可跳過此步。採用寫時複製:在專用區域保存被修改頁的舊版本,類似 InnoDB 的 MVCC 簡化版。也有三重鏡像實現(RAID1+1 熱備盤)。快照分只讀與可讀寫;後者優勢在於無需預先同步文件系統日志,且可直接在快照上啟動 MySQL 進行恢復驗證、表檢查,避免備份已損壞數據。
# 1. 加全局讀鎖(純 InnoDB 可跳過)
mysql> FLUSH TABLES WITH READ LOCK;
# 2. 創建快照(預留足夠 undo 空間,如 16GB)
shell> lvcreate -L16G -s -n dbbackup /dev/Main/Data
# 若報錯 "device-mapper target not detected",執行:
shell> modprobe dm-snapshot
# 3. 記錄 binlog 位點(Slave 構建必需)
mysql> SHOW MASTER STATUS;
# 4. 釋放鎖
mysql> UNLOCK TABLES;
# 5. 掛載快照
shell> mount /dev/Main/dbbackup /mnt/backup
# 6. 拷貝數據(可跳過 slow/error log,視 slave 延遲決定是否保留近期 binlog)
shell> rsync -av /mnt/backup/ /backup/destination/
# 7. 卸載並刪除快照
shell> umount /mnt/backup
shell> lvremove -f /dev/Main/dbbackup
# 9. 將數據拷貝至 Slave 數據目錄
# 10. 啟動 MySQL 等待崩潰恢復完成
# 11. 指定同步起點
mysql> CHANGE MASTER TO
master_host="master", master_user="user", master_password="pass",
master_log_file="host-bin.000335", master_log_pos=401934686;
# 12. 啟動同步
mysql> START SLAVE;
用 SHOW SLAVE STATUS 替代 SHOW MASTER STATUS 獲取位點即可無需停止 Slave。但警告:這會連帶複製 Slave 累積的數據不一致(特別是使用了 slave_skip_errors 或 sql_slave_skip_counter 時)。克隆 Master 則保證一致性基線。
Lenz Grimmer 的 mylvmbackup 封裝了上述流程,生產可用。