數據庫備份是 DBA 的底線工程。本文系統梳理邏輯備份、物理備份、二進制日志配合的完整體系,並給出生產環境可落地的操作規範。
| 維度 | mysqldump (邏輯備份) | 物理備份 (文件拷貝/xtrabackup) |
|---|---|---|
| 原理 | 通過 SQL 協議導出 DDL+DML | 直接拷貝數據文件(.ibd/.frm/.MYD/.MYI) |
| 一致性保證 | 單線程 --single-transaction (InnoDB) / 鎖表 (MyISAM) | 需停庫或使用 LVM 快照/xtrabackup 熱備 |
| 可移植性 | 跨版本、跨架構、跨存儲引擎 | 同版本、同架構、同引擎(MyISAM 更嚴格) |
| 速度 | 慢(受限於 SQL 解析/網絡) | 快(接近磁盤順序讀寫速度) |
| 恢復靈活性 | 可選庫/表/行恢復、異構導入 | 通常整庫恢復,部分恢復需導入後再導出 |
| 佔用資源 | CPU 高、網絡佔用 | I/O 高、磁盤佔用 |
mysqldump \
--host=127.0.0.1 --port=3306 \
--user=backup_user --password='xxx' \
--single-transaction --master-data=2 --flush-logs \
--routines --triggers --events \
--hex-blob --default-character-set=utf8mb4 \
--databases db1 db2 \
--result-file=/backup/db_full_$(date +%F_%H%M).sql
# 關鍵參數解讀:
# --single-transaction: InnoDB 一致性快照,無需鎖表
# --master-data=2: 輸出 CHANGE MASTER TO 註釋,記錄 Binlog 位置,用於主從搭建/PITR
# --flush-logs: 切換 Binlog,配合增量備份劃定邊界
# 全量備份
xtrabackup --backup --target-dir=/backup/full_$(date +%F) \
--user=backup_user --password='xxx' --parallel=4 --compress
# 增量備份 (基於上一次全量/增量的 LSN)
xtrabackup --backup --target-dir=/backup/inc_$(date +%F_%H%M) \
--incremental-basedir=/backup/full_2024-01-15 --parallel=4 --compress
# 準備/恢復
xtrabackup --prepare --target-dir=/backup/full_2024-01-15
xtrabackup --prepare --apply-log-only --target-dir=/backup/full_2024-01-15 \
--incremental-dir=/backup/inc_2024-01-15_0600
# 複製回數據目錄或使用 --copy-back
log_bin、binlog_format=ROW、expire_logs_days=7(配合備份周期)。mysqlbinlog --start-position=XXX --stop-position=YYY binlog.xxx | mysql 重放增量日志--start-datetime="2024-01-15 10:00:00" --stop-datetime="2024-01-15 10:30:00"{db}_{type}_{YYYYMMDD_HHMM}.{sql|xb.gz},如 order_full_20240115_0200.sql.gz。gzip -9 / zstd -19 + openssl enc -aes-256-gcm。cp/tar 直接拷貝運行中實例的數據目錄 → 數據不一致。mysql.upgrade、mysql.sock、auto.cnf (server_uuid) 等關鍵文件。CHECK TABLE/OPTIMIZE TABLE,改在從庫執行。備份的價值在於「可恢復」。只有經過驗證的備份,才是真正的備份。