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 CLIENT | CREATE 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,節省空間)
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)
關鍵階段:
xtrabackup_logfileFLUSH TABLES WITH READ LOCK (FTWRL) → 複製非 InnoDB 文件 → UNLOCK TABLESxtrabackup_binlog_info 記錄 Binlog 位置# 必須指定到時間戳子目錄! innobackupex --apply-log /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep
雙階段 --prepare:
ib_logfile0/1,LSN 推進# 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
# 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,適合少量表恢復。
mysqlbinlog --start-position=482 mysql-bin.000002 > increment.sqlSOURCE increment.sql; 重放增量 Binlog| 優化目標 | 參數 | 推薦值/策略 | 說明 |
|---|---|---|---|
| 防止 FTWRL 阻塞 | --ftwrl-wait-timeout=60 | 60s | 等待長查詢結束再加鎖,超時退出不阻塞業務 |
| 殺死阻塞長查詢 | --kill-long-queries-timeout=10 | 10s | FTWRL 後仍阻塞則 Kill,默認 0 不殺 |
| 縮短非 InnoDB 鎖定時間 | --rsync | 啟用 | 用 rsync 替換 cp 批量複製 .frm/.MYD/.MYI,大幅加速 |
| 並行備份/準備/恢復 | --parallel=4 | CPU 核心數/2 | 備份、壓縮、加密、apply-log、copy-back 全鏈路並行 |
| 準備階段內存 | --use-memory=4G | 物理內存 50%-70% | 崩潰恢復排序緩衝,加速 --apply-log |
| 從庫備份優化 | --safe-slave-backup --slave-info | 啟用 | 暫停 SQL 線程待無臨時表再備份,記錄主庫 Binlog 位點 |
| 限流備份 I/O | --throttle=100 | 100-200 IOPS | 避免備份佔滿磁盤帶寬影響業務 |
| 壓縮備份 | --compress --compress-threads=4 | 啟用 | 需安裝 qpress,節省 60%+ 存儲 |
| 加密備份 | --encrypt=AES256 --encrypt-key-file=/path/key | 合規要求時 | 備份文件落盤加密,滿足安全審計 |
--apply-log 重放 [Start LSN, End LSN] 區間 Redo Log,利用 InnoDB Crash Recovery 機制達到 End LSN 時刻的一致性視圖.ibd.delta 文件# 每日 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 物理熱備份的黃金標準。掌握其全鏈路操作、優化參數與原理機制,是構建高可用、可恢復、可審計數據庫運維體系的核心技能。