首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Percona XtraBackup 物理備份實戰大全:全量、增量、部分、PITR 恢復與生產級優化最佳實踐

     編輯:MySQL 綜合教學

Percona XtraBackup 物理備份實戰大全:全量、增量、部分、PITR 恢復與生產級優化最佳實踐

XtraBackup 是 MySQL 物理熱備份的行業標準,支援非阻塞 InnoDB 備份、增量、壓縮、加密、流式傳輸、並行處理、Point-in-Time Recovery (PITR) 等企業級特性。本文基於 Percona XtraBackup 2.3.2 / MySQL 5.6.26 實戰環境,完整記錄從權限規劃、全量/增量/部分備份、多階段恢復、PITR 到生產優化參數的全鏈路操作手冊。

一、 權限規劃:雙層授權模型

層級對象最小權限集進階權限(部分備份/優化鎖/導出)
系統層Linux 用戶datadir 讀/寫/執行、備份目錄讀/寫/執行、xtrabackup 二進制執行權限-
MySQL 層備份賬號 (bkpuser)RELOAD, LOCK TABLES, REPLICATION CLIENTCREATE TABLESPACE, PROCESS, SUPER
CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'xxx';
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
-- 進階場景追加
GRANT CREATE TABLESPACE, PROCESS, SUPER ON *.* TO 'bkpuser'@'localhost';

二、 核心命令結構

innobackupex [選項] BACKUP_ROOT_DIR                    # 備份
innobackupex --apply-log [選項] BACKUP_DIR              # 準備(重放 Redo/Undo)
innobackupex --copy-back [選項] BACKUP_DIR              # 恢復(複製回 datadir)
innobackupex --move-back [選項] BACKUP_DIR              # 恢復(移動回 datadir,節省空間)

三、 全量備份與恢復標準流程

1. 全量備份

innobackupex /backup/xtrabackup/full --user=bkpuser --password=digdeep
# 輸出目錄:/backup/xtrabackup/full/2015-11-05_22-38-55/ (含 xtrabackup_checkpoints, xtrabackup_binlog_info, backup-my.cnf)

關鍵階段:

  1. 啟動 log-copy 線程持續監控 Redo Log 複製到 xtrabackup_logfile
  2. data-file-copy 線程逐 Page 複製 .ibd/.frm 文件(驗證 checksum,失敗重試 10 次)
  3. FLUSH TABLES WITH READ LOCK (FTWRL) → 複製非 InnoDB 文件 → UNLOCK TABLES
  4. 生成 xtrabackup_binlog_info 記錄 Binlog 位置

2. 準備階段

# 必須指定到時間戳子目錄!
innobackupex --apply-log /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep

雙階段 --prepare:

  1. 前滾 + 回滾:重放已提交事務、回滾未提交事務 → 崩潰恢復達到一致性狀態
  2. 生成新的 ib_logfile0/1,LSN 推進

3. 恢復

# 1. 停庫
mysqladmin -uroot -pxxx shutdown

# 2. 清空 datadir (或 mv 歸檔)
cd /var/lib/mysql && mv * /backup/old_datadir/

# 3. 複製回
innobackupex --copy-back /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep

# 4. 修正權限(關鍵!否則 InnoDB 報 "can't be opened in read-write mode")
chown -R mysql:mysql /var/lib/mysql

# 5. 啟庫
mysqld_safe --user=mysql &

四、 增量備份鏈與恢復

備份鏈構建

# 基礎全量
innobackupex /backup/xtrabackup/full --user=bkpuser --password=digdeep
# 增量 1 (基於全量)
innobackupex --incremental /backup/xtrabackup/incr1 --incremental-basedir=/backup/xtrabackup/full/2015-11-06_11-29-51/ --user=bkpuser --password=digdeep
# 增量 2 (基於增量 1)
innobackupex --incremental /backup/xtrabackup/incr2 --incremental-basedir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/ --user=bkpuser --password=digdeep

增量恢復鏈(關鍵:僅最後一次用 --redo-only)

# 1. 基礎全量 --redo-only
innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/

# 2. 增量 1 --redo-only
innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/

# 3. 增量 2 (最後一次,無 --redo-only,執行完整崩潰恢復)
innobackupex --apply-log /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr2/2015-11-06_11-43-22/

# 4. --copy-back + chown + 啟庫

原理: 中間增量只能 Redo(前滾),不能 Undo(回滾),因為未提交事務可能在下一個增量中提交,過早回滾會導致後續增量應用失敗。

五、 部分備份與單表導入

# 僅備份 test 庫
innobackupex --databases test /backup/xtrabackup/ --user=bkpuser --password=digdeep

# 準備並導出元數據
innobackupex --apply-log --export /backup/xtrabackup/2015-11-06_15-39-34/

# 目標庫建表結構
CREATE DATABASE partial;
USE partial;
CREATE TABLE city LIKE test.city;
ALTER TABLE city DISCARD TABLESPACE;

# 複製 .ibd + .exp 文件並修正權限
cp /backup/.../test/city.{ibd,exp} /var/lib/mysql/partial/
chown -R mysql:mysql /var/lib/mysql/partial

# 導入表空間
ALTER TABLE city IMPORT TABLESPACE;

限制: 需 innodb_file_per_table=ON;無法直接 --copy-back,需逐表 IMPORT TABLESPACE,適合少量表恢復。

六、 Point-in-Time Recovery (PITR) 完美演練

  1. 全量備份 → 增量 1 → 增量 2
  2. 業務繼續寫入 Binlog
  3. 磁盤故障,Binlog 完好
  4. 按增量鏈恢復到增量 2 完成點
  5. mysqlbinlog --start-position=482 mysql-bin.000002 > increment.sql
  6. SOURCE increment.sql; 重放增量 Binlog
  7. 數據庫恢復到故障前瞬間

七、 生產級優化參數速查表

優化目標參數推薦值/策略說明
防止 FTWRL 阻塞--ftwrl-wait-timeout=6060s等待長查詢結束再加鎖,超時退出不阻塞業務
殺死阻塞長查詢--kill-long-queries-timeout=1010sFTWRL 後仍阻塞則 Kill,默認 0 不殺
縮短非 InnoDB 鎖定時間--rsync啟用用 rsync 替換 cp 批量複製 .frm/.MYD/.MYI,大幅加速
並行備份/準備/恢復--parallel=4CPU 核心數/2備份、壓縮、加密、apply-log、copy-back 全鏈路並行
準備階段內存--use-memory=4G物理內存 50%-70%崩潰恢復排序緩衝,加速 --apply-log
從庫備份優化--safe-slave-backup --slave-info啟用暫停 SQL 線程待無臨時表再備份,記錄主庫 Binlog 位點
限流備份 I/O--throttle=100100-200 IOPS避免備份佔滿磁盤帶寬影響業務
壓縮備份--compress --compress-threads=4啟用需安裝 qpress,節省 60%+ 存儲
加密備份--encrypt=AES256 --encrypt-key-file=/path/key合規要求時備份文件落盤加密,滿足安全審計

八、 核心原理深度解析

  1. 雙線程協作: log-copy 線程(秒級輪詢 Redo Log)+ data-file-copy 線程(Page 級複製驗證)
  2. 一致性保證: 備份開始記錄 Start LSN,備份結束記錄 End LSN。雖數據文件非即時一致,但通過 --apply-log 重放 [Start LSN, End LSN] 區間 Redo Log,利用 InnoDB Crash Recovery 機制達到 End LSN 時刻的一致性視圖
  3. 增量原理: 全表掃描比較 Page LSN > 上次備份 LSN,變更 Page 寫入 .ibd.delta 文件
  4. Backup Locks (5.6+): 輕量級鎖替代 FTWRL,不阻塞 InnoDB DML,僅阻塞 DDL 與非事務表寫入

九、 總結:生產級備份策略建議

# 每日 02:00 全量備份 (保留 14 天)
0 2 * * * innobackupex --parallel=4 --use-memory=4G --compress --compress-threads=2 \
  --ftwrl-wait-timeout=60 --rsync --throttle=200 \
  /backup/xtrabackup/full --user=bkpuser --password=xxx

# 每小時增量備份 (保留 48 小時)
0 * * * * innobackupex --incremental /backup/xtrabackup/incr \
  --incremental-basedir=$(find /backup/xtrabackup/full -maxdepth 1 -type d -name '20*' | sort | tail -1) \
  --parallel=2 --throttle=100 \
  --user=bkpuser --password=xxx

# Binlog 實時異地同步 (rsync/rsyncd 或 Kafka Connect)
# 定期演練:全量+增量+PITR 恢復演練,驗證 RPO/RTO

XtraBackup 以「文件級物理複製 + Redo Log 重放」架構,實現了 MySQL 物理熱備份的黃金標準。掌握其全鏈路操作、優化參數與原理機制,是構建高可用、可恢復、可審計數據庫運維體系的核心技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved