MySQL 備份分為邏輯備份(SQL 語句)與物理備份(資料檔)。本文對比四大主流工具在原理、速度、一致性、適用場景上的差異,幫助你根據資料量、RTO/RPO 選出最佳方案。
| 工具 | 類型 | 熱備份 | 速度 | 空間 | 恢復速度 | 適用場景 |
|---|---|---|---|---|---|---|
| mysqldump | 邏輯 | InnoDB ✅ (單事務) | 慢 | 小 | 慢 | <50GB、需跨版本遷移、部分導出 |
| LVM 快照 | 物理 | 需鎖表(秒級) | 極快 | 大 | 極快 | 大數據量、檔案系統支援 LVM、可容忍秒級鎖 |
| tar/cp | 物理 | ❌ 冷備份 | 中 | 大 | 快 | 離線維護窗口、簡單遷移 |
| XtraBackup | 物理 | ✅ 完全熱備 | 快 | 中 | 快 | 生產核心庫、大數據量、增量備份、PITR |
mysqldump --databases test --lock-all-tables --flush-logs \
> /backup/test_$(date +%F_%H-%M).sql
mysqldump --databases test --single-transaction --flush-logs --master-data=2 \
> /backup/test_$(date +%F_%H-%M).sql
SET sql_log_bin=0; SOURCE backup.sql; 避免重放寫入 Binlog 浪費空間與時間。# 1. 主庫加全域讀鎖並切 Binlog
mysql -e "FLUSH TABLES WITH READ LOCK; FLUSH LOGS;"
# 2. 建立快照卷(1G 大小,唯讀)
lvcreate -L 1G -s -n data-snap -p -r /dev/myvg/mydata
# 3. 釋放鎖
mysql -e "UNLOCK TABLES;"
# 4. 掛載快照並打包
mount -r /dev/myvg/data-snap /mnt/snap
tar -czf /backup/mysql_snap_$(date +%F).tar.gz -C /mnt/snap .
# 5. 卸載移除快照
umount /mnt/snap
lvremove -f /dev/myvg/data-snap
恢復:停服務 → 替換資料目錄 → 啟動 → 用 Binlog 推進到故障點(PITR)。
# 窗口 1:加鎖
mysql -e "FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;"
# 記錄 File/Position,窗口保持不退出
# 窗口 2:打包
cd /var/lib/mysql
tar -zcvf /backup/mysql_$(date +%F).tar.gz mysql
# 窗口 1:解鎖
mysql -e "UNLOCK TABLES;"
.ibd 檔案,邊監聽 redo log 變更頁面。--prepare 階段重放 redo log 使資料頁一致(類似 Crash Recovery)。# 全量備份
xtrabackup --backup --target-dir=/backup/full_$(date +%F) --user=root --password=xxx
# 增量備份(基於上次全量)
xtrabackup --backup --target-dir=/backup/inc_$(date +%F) \
--incremental-basedir=/backup/full_2024-01-01 --user=root --password=xxx
# 準備/合併
xtrabackup --prepare --apply-log-only --target-dir=/backup/full_2024-01-01
xtrabackup --prepare --target-dir=/backup/inc_2024-01-02 --incremental-basedir=/backup/full_2024-01-01
# 恢復
systemctl stop mysqld
xtrabackup --copy-back --target-dir=/backup/full_2024-01-01
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
innodb_file_per_table=ON)、壓縮/加密/流式傳輸。建議採用「全量 XtraBackup + 增量 XtraBackup + Binlog PITR」分層策略,兼顧恢復速度與資料安全。