MySQL 備份分為邏輯備份 (SQL 文本) 與物理備份 (文件級),兩者互補。本文系統對比優劣、講解 mysqldump 進階用法、XtraBackup 熱備原理、恢複演練標準化流程。
| 維度 | 邏輯備份 (mysqldump) | 物理備份 (XtraBackup/文件拷貝) |
|---|---|---|
| 原理 | 導出 SQL 文本 (CREATE/INSERT) | 拷貝數據文件 (.ibd/.frm/.MYD/.MYI) |
| 一致性 | --single-transaction (InnoDB 熱備) | 複製時需鎖表或 LVM 快照/xtrabackup |
| 可移植性 | 跨版本/架構/存儲引擎 | 同版本/同架構/同引擎 (MyISAM 跨架構需注意字節序) |
| 速度 | 慢 (SQL 解析/執行) | 極快 (流式複製,受限於磁盤 I/O) |
| 恢複速度 | 慢 (重建索引、執行 INSERT) | 快 (直接啟動實例) |
| 增量備份 | Binlog (需開啟 log-bin) | XtraBackup 增量備份 (基於 LSN) |
| 適用場景 | 中小庫、跨環境遷移、審計、開發環境同步 | 大庫 (TB 級)、核心生產庫、RTO/RPO 要求極高 |
mysqldump -h localhost -u backup_user -p \
--single-transaction \ # InnoDB 一致性熱備 (不鎖表)
--master-data=2 \ # 註釋記錄 Binlog 位點 (CHANGE MASTER TO)
--routines --triggers --events \ # 存儲過程/觸發器/事件
--hex-blob \ # 二進制列十六進制導出 (避免字符集問題)
--quick \ # 流式讀取不緩存結果集 (大表必加)
--max_allowed_packet=1G \ # 大 BLOB/TEXT 支持
--databases db1 db2 \ # 指定庫 (或 --all-databases)
> /backup/logical/full_$(date +%F_%H%M).sql
# 1. 完全備份 (不阻塞讀寫)
xtrabackup --backup --target-dir=/backup/physical/full_$(date +%F) \
--user=backup_user --password=xxx --parallel=4 --compress --compress-threads=4
# 2. 準備 (回放 Redo Log 達到一致性)
xtrabackup --prepare --target-dir=/backup/physical/full_$(date +%F) --use-memory=4G
# 3. 增量備份 (基於 LSN)
xtrabackup --backup --target-dir=/backup/physical/inc_$(date +%F_%H) \
--incremental-basedir=/backup/physical/full_$(date +%F) --user=... --parallel=4
# 4. 恢複 (合併增量到完全備份目錄)
xtrabackup --prepare --apply-log-only --target-dir=/backup/physical/full_$(date +%F)
xtrabackup --prepare --target-dir=/backup/physical/full_$(date +%F) # 最後一次不加 --apply-log-only
# 5. 啟動實例 (修改 datadir 指向備份目錄)
mysql < backup.sql / 物理備份直接啟動mysqlbinlog --start-datetime=... --stop-datetime=... binlog.xxx | mysql)