備份從庫而非主庫是生產環境降低主庫壓力、避免鎖表影響寫入的標準做法。但從庫備份有獨特挑戰:需記錄 Relay Log 位點以便還原後精確定位主庫 Binlog。本文詳解 CentOS 7 下 mysqldump 邏輯備份與物理檔案備份兩條路徑,含關鍵位點記錄、SELinux 權限坑、還原驗證全流程。
還原從庫後,需執行 CHANGE MASTER TO 指定主庫 Binlog 檔案與位置。這兩個值來自從庫的 relay-log.info (或 master.info):
/var/lib/mysql/mysql-relay-bin.000002 # Relay Log 檔案
720 # Relay Log 位置
mysql-bin.000002 # **主庫 Binlog 檔案 (關鍵)**
3968 # **主庫 Binlog 位置 (關鍵)**
紅框標記的兩行 是還原後 CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=3968 的依據。**務必與資料備份一起保存**。
# 1. 停止 SQL 線程 (IO 線程繼續接收 Binlog,不影響主從同步延遲指標)
mysqladmin stop-slave -uroot -p
# 2. 導出全庫 (單事務保證一致性,含存儲過程/觸發器/事件)
mysqldump --all-databases \
--single-transaction \
--routines --triggers --events \
--master-data=2 \ # 註釋形式輸出 CHANGE MASTER TO 位點 (關鍵)
--flush-logs \ # 切換 Binlog,配合增量備份
--hex-blob \
> /backup/fulldb_$(date +%F_%H%M).sql
# 3. 重新啟動 SQL 線程
mysqladmin start-slave -uroot -p
# 4. 打包備份檔 + 關鍵位點檔
tar -czf /backup/db_full_$(date +%F_%H%M).tar.gz \
/backup/fulldb_*.sql \
/var/lib/mysql/relay-log.info \
/var/lib/mysql/master.info
關鍵參數解析:
--master-data=2:輸出 -- CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...; 註釋,**還原時直接執行 SQL 即可自動定位**,無需手動查 relay-log.info--single-transaction:InnoDB 熱備份核心,利用 MVCC 避免鎖表--flush-logs:備份瞬間切換 Binlog,便於後續增量備份切分# 1. 導入邏輯備份
mysql -uroot -p < /backup/fulldb_2024-01-15.sql
# 2. 因 --master-data=2 已在 SQL 含 CHANGE MASTER 註釋,啟動複寫即可
STOP SLAVE;
-- 若需手動指定 (無 master-data 時):
-- CHANGE MASTER TO MASTER_HOST='192.168.10.201', MASTER_USER='slave_user', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=3968;
START SLAVE;
# 3. 驗證
SHOW SLAVE STATUS\G
# 關鍵指標:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
# --- 方案 A: tar 冷備份 (需停機) ---
systemctl stop mariadb
tar --selinux --acls --xattrs -czPf /backup/db_physical_$(date +%F).tar.gz /var/lib/mysql/
systemctl start mariadb
# --- 方案 B: XtraBackup 熱備份 (推薦,不停機) ---
xtrabackup --backup --target-dir=/backup/xtrabackup/full_$(date +%F) --user=root --password=xxx
xtrabackup --prepare --target-dir=/backup/xtrabackup/full_$(date +%F) # 必須 prepare
關鍵參數 --selinux --acls --xattrs: 保留 SELinux 上下文、ACL 權限、擴展屬性,還原到啟用 SELinux 的目標機器時避免 File not found (Errcode: 13) 權限錯誤。
# tar 冷備份還原
systemctl stop mariadb
tar --selinux --acls --xattrs -xzPf /backup/db_physical_2024-01-15.tar.gz -C /
systemctl start mariadb
# XtraBackup 還原
systemctl stop mariadb
rm -rf /var/lib/mysql/*
xtrabackup --copy-back --target-dir=/backup/xtrabackup/full_2024-01-15
chown -R mysql:mysql /var/lib/mysql
systemctl start mariadb
# 關鍵:還原後必須重新配置複寫 (物理備份不含主庫位點)
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='...', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=3968;
START SLAVE;
[ERROR] mysqld: File '/var/lib/mysql/mysql-bin.index' not found (Errcode: 13)
[ERROR] Aborting
ls -Z /var/lib/mysql/mysql-bin.index
# 輸出顯示 context 為 unconfined_u:object_r:var_lib_t:s0 (正常)
# 若顯示其他 context (如 home_root_t) 即為標籤錯誤
tar --selinux --acls --xattrsrestorecon -Rv /var/lib/mysqlsetenforce 0 或修改 /etc/selinux/config 設 SELINUX=permissive 重啟| 維度 | mysqldump (邏輯) | XtraBackup (物理熱備) | tar 冷備份 |
|---|---|---|---|
| 資料一致性 | ✅ (單事務 MVCC) | ✅ (Redo Log apply) | ✅ (停機) |
| 對主庫/從庫影響 | 輕微 (長事務可能阻塞 DDL) | 極小 (僅 FLUSH TABLES WITH READ LOCK 秒級) | 完全停機 |
| 備份速度 | 慢 (SQL 解析+壓縮) | 快 (檔案複製級) | 快 (檔案複製) |
| 恢復速度 | 極慢 (SQL 重放+建索引) | 快 (檔案複製+啟動) | 快 |
| 跨版本/架構遷移 | ✅ 支援 | ❌ 嚴格版本/架構一致 | ❌ 嚴格一致 |
| 單表/單庫恢復 | ✅ 容易 (sed 擷取 SQL) | ❌ 難 (需匯入再導出) | ❌ 不支援 |
| 備份檔案大小 | 較小 (壓縮後 ~資料量 30%) | 較大 (~資料量 80-100%) | 大 (原始檔案) |
┌─────────────────────────────────────────────────────────────┐
│ 備份策略分層 │
├─────────────────────────────────────────────────────────────┤
│ 每日 02:00 從庫 XtraBackup 全量物理備份 (保留 7 天) │ ← 核心災難恢復 (RTO 最短)
│ 每小時 從庫 XtraBackup 增量備份 (保留 24 小時) │ ← 增量恢復點 (RPO = 1h)
│ 每日 03:00 從庫 mysqldump 邏輯備份 (保留 30 天) │ ← 跨版本遷移、審計、單表恢復
│ 實時 主庫 Binlog 同步至異地存儲 (S3/MinIO) │ ← 極端災難 (機房級)
└─────────────────────────────────────────────────────────────┘
從庫備份**必須保存主庫 Binlog 位點** (--master-data=2 或 relay-log.info)。物理備份 (XtraBackup) 為核心災備,邏輯備份 (mysqldump) 為輔助遷移/審計。SELinux 環境務必保留檔案屬性。建立分層備份體系,定期演練恢復,才能在故障發生時從容應對。