備份分類與工具選型
| 類型 | 工具 | 特點 | RPO/RTO | 適用場景 |
| 邏輯備份 | mysqldump, myloader | SQL 文本、跨版本遷移、可編輯 | RPO: 小時級 / RTO: 小時級 | 小數據集 (<10GB)、異構遷移、開發環境 |
| 物理備份 | Percona XtraBackup, Mariabackup, ibbackup | 頁級複製、熱備份、不阻塞寫入、壓縮/加密 | RPO: 分鐘級 / RTO: 分鐘級 | 生產大數據集、InnoDB、高可用要求 |
| 快照備份 | LVM/ZFS/EBS 快照 + 刷新日誌 | 秒級凍結、存儲層面、需文件系統支持 | RPO: 秒級 / RTO: 分鐘級 | 雲環境、大數據倉、配合物理備份 |
| 二進制日誌 | mysqlbinlog, GTID | 增量變更、時間點恢復 (PITR) 核心 | RPO: 秒級 / RTO: 視回放量 | 所有生產環境必開啟 |
核心架構:全量 + 增量 + PITR
┌─────────────┐ ┌──────────────┐ ┌──────────────────┐
│ 每日全量 │ ──▶ │ Binlog 連續 │ ──▶ │ 時間點恢復 (PITR) │
│ XtraBackup │ │ 歸檔/傳輸 │ │ Full + Binlog→Pos │
└─────────────┘ └──────────────┘ └──────────────────┘
│ │ │
▼ ▼ ▼
壓縮加密 異地存儲 並行回放優化
上傳對象存儲 多 AZ/Region 只恢復目標庫/表
實戰操作指南
1. 開啟 Binlog 與 GTID (MySQL 5.6+)
[mysqld]
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW -- 必須 ROW 格式,支持 PITR、複製一致性
gtid_mode = ON
enforce_gtid_consistency = ON
expire_logs_days = 7 -- 配合歸檔策略,防止磁盤爆滿
max_binlog_size = 1G
sync_binlog = 1 -- 每次提交刷盤,最強持久性
binlog_checksum = CRC32 -- 檢測損壞
2. 全量熱備份 (XtraBackup)
# 完全備份 (非阻塞)
xtrabackup --backup --target-dir=/backup/full_$(date +%F) --compress --threads=4 --user=backup --password=***
# 增量備份 (基於上一次 LSN)
xtrabackup --backup --target-dir=/backup/inc_$(date +%F_%H) \
--incremental-basedir=/backup/full_2024-01-15 --compress --threads=4
# 備份驗證 (備份後必做!)
xtrabackup --prepare --target-dir=/backup/full_2024-01-15 --apply-log-only
# 增量合併驗證
xtrabackup --prepare --target-dir=/backup/full_2024-01-15 --incremental-dir=/backup/inc_2024-01-15_06
3. 時間點恢復 (PITR) 標準流程
- 停止寫入:應用層停止流量或設置
super_read_only=ON。
- 恢復全量備份:
xtrabackup --prepare --target-dir=/backup/full_2024-01-15
# 複製回數據目錄 (需停止 mysqld)
rsync -av /backup/full_2024-01-15/ /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql
- 啟動實例(跳過 GTID 恢復階段):
mysqld --skip-slave-start --skip-gtid-recovery --datadir=/var/lib/mysql &
- 回放 Binlog 到目標時間點:
# 方式 A: 基於位置 (傳統)
mysqlbinlog --start-datetime="2024-01-15 14:30:00" --stop-datetime="2024-01-15 14:35:00" \
/var/log/mysql/mysql-bin.000123 | mysql -u root -p
# 方式 B: 基於 GTID (推薦,自動跳過已執行事務)
mysqlbinlog --include-gtids="aaa-bbb-ccc:1-1000" /var/log/mysql/mysql-bin.000123 | mysql -u root -p
- 驗證數據一致性:核心表行數、關鍵業務指標、校驗和對比。
- 重建複製/上線:
CHANGE MASTER TO ...; START SLAVE; 或切換流量。
4. 單表恢復 (不想全庫恢復)
- 方案 A:全量備份恢復到臨時實例 →
mysqldump 導出目標表 → 導入生產庫。
- 方案 B:XtraBackup
--export 導出 .ibd + IMPORT TABLESPACE (需 innodb_file_per_table=ON),極快但版本敏感。
- 方案 C:Binlog 過濾工具
mysqlbinlog --database=db --table=tbl 提取單表變更回放。
自動化與監控體系
# 典型 Crontab / Systemd Timer
0 2 * * * /usr/local/bin/backup_full.sh >> /var/log/backup_full.log 2>&1
0 * * * * /usr/local/bin/backup_inc.sh >> /var/log/backup_inc.log 2>&1
# Binlog 實時傳輸 (rsync/inotify/kafka/Flannel)
關鍵監控指標
- 備份成功率、耗時、輸出大小、壓縮比。
- Binlog 積壓大小、傳輸延遲、磁盤剩餘空間。
- 季度恢復演練:模擬 PITR、單表恢復、異地恢復,記錄 RTO 實測值。
雲托管服務差異 (RDS / CloudSQL / PolarDB)
| 服務 | 全量備份 | Binlog/PITR | 單表恢復 | 跨區域 |
| AWS RDS | 自動每日 + 手動快照 | 自動保留 0-35 天,PITR 到秒 | 不支持,需導出/導入 | 快照跨區域複製 |
| 阿里云 RDS | 自動 + 手動,支持物理/邏輯 | 日志備份保留 7-730 天,PITR | 支持(物理備份導出) | 跨地域備份/恢復 |
| PolarDB | 秒級快照、無窗口 | 日志即時上傳 OSS,PITR | 支持(克隆集群導出) | 多可用區/跨地域 |
備份的價值在於「可恢復」。**沒有驗證過的備份等於沒有備份**。建立「全量+增量+Binlog」三層防線,自動化執行、異地存儲、定期演練、監控告警全覆蓋,才能在災難來臨時從容應對,將 RTO/RPO 控制在業務可接受範圍內。