萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 從庫備份與還原完整指南:mysqldump 與物理備份雙軌實戰

備份從庫而非主庫是生產環境降低主庫壓力、避免鎖表影響寫入的標準做法。但從庫備份有獨特挑戰:需記錄 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 的依據。**務必與資料備份一起保存**。

方案一:mysqldump 邏輯備份 (通用、跨版本、可篩選)

備份流程 (從庫執行)

# 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

方案二:物理檔案備份 (XtraBackup / tar 快照) - 速度快、恢復快

適用場景

  • 資料量 > 500GB,邏輯備份耗時過長
  • 需秒級恢復 RTO (邏輯導入需重建索引,物理備份直接啟動)
  • 保留完整 InnoDB 系統表空間、Redo Log、Undo Log、表空間 ID 映射

備份流程 (需停庫,或用 XtraBackup 熱備)

# --- 方案 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;

SELinux 權限錯誤排查實戰

錯誤現象

[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) 即為標籤錯誤

解決方案

  1. 備份/還原時帶屬性 (推薦): tar --selinux --acls --xattrs
  2. 還原後恢復上下文: restorecon -Rv /var/lib/mysql
  3. 臨時關閉 SELinux (不推薦生產): setenforce 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 環境務必保留檔案屬性。建立分層備份體系,定期演練恢復,才能在故障發生時從容應對。

copyright © 萬盛學電腦網 all rights reserved