Percona XtraBackup 實戰:MySQL 在線熱備份、增量備份與極速恢復全流程
XtraBackup 是 Percona 開源的物理熱備份工具,支持 InnoDB/XtraDB 非阻塞備份、MyISAM 鎖表備份、增量備份、流式傳輸、壓縮加密、備份驗證。本文覆蓋安裝部署、全量/增量備份恢復、核心參數、MyISAM 一致性處理、實戰避坑。
一、核心組件與原理
| 組件 | 功能 |
xtrabackup | C 編譯主程序,執行物理文件拷貝、Redo Log 尾隨拷貝、Prepare 階段應用 Redo Log (Crash Recovery) |
innobackupex | Perl 封裝腳本 (2.3 版為符號鏈接,已棄用),協調 MyISAM 鎖表、調用 xtrabackup、複製 .frm/.opt 等元數據 |
xbstream | 流式打包/解包工具,支持並行、壓縮、加密傳輸 |
xbcrypt | 備份文件加密/解密 |
xbcloud | 雲存儲 (S3/MinIO/Azure) 上傳下載 |
工作原理:
- 啟動記錄 LSN (Log Sequence Number)。
- 拷貝數據文件 (.ibd, .frm 等) — 過程中數據可能變更。
- 後台線程持續尾隨拷貝 Redo Log (循環寫入,必須跟上)。
- 拷貝完成 →
FLUSH TABLES WITH READ LOCK (FTWRL) → 拷貝 MyISAM/系統表 → 釋放鎖。
- Prepare 階段:應用拷貝的 Redo Log 到數據文件 (前滾已提交事務,回滾未提交),使數據文件達到備份結束時刻的一致性狀態。
二、安裝部署 (CentOS 7/8)
# 1. 依賴
yum -y install perl perl-devel libaio libaio-devel perl-DBI perl-DBD-MySQL perl-TermReadKey perl-Time-HiRes
# 2. 下載二進制包 (Percona 官網)
cd /usr/local/src
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.28/binary/tarball/percona-xtrabackup-2.4.28-Linux-x86_64.tar.gz
tar -zxf percona-xtrabackup-2.4.28-Linux-x86_64.tar.gz
cd percona-xtrabackup-2.4.28-Linux-x86_64
mkdir -p /usr/local/xtrabackup
mv bin /usr/local/xtrabackup/
ln -s /usr/local/xtrabackup/bin/* /usr/bin/
# 3. 驗證
xtrabackup --version
innobackupex --version
三、my.cnf 關鍵配置 (供 XtraBackup 讀取)
[mysqld]
datadir=/var/lib/mysql
innodb_data_home_dir=/data/mysql/ibdata
innodb_log_group_home_dir=/data/mysql/iblogs
innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=1G
# 確保 xtrabackup 能正確解析表空間與日志路徑
四、全量備份與恢復
1. 全量備份
# 全庫備份
innobackupex --user=root --password=xxx /data/backup/
# 單庫備份
innobackupex --user=root --password=xxx --database=test_db /data/backup/
# 多庫/多表 (正則)
innobackupex --user=root --password=xxx --include='db1.*|db2.tbl1' /data/backup/
# 流式備份 + 壓縮 (跨機器傳輸)
innobackupex --user=root --password=xxx --stream=xbstream /data/backup/ | gzip > /data/backup/full_$(date +%F).xbstream.gz
# 解壓: mkdir -p /restore && cat full.xbstream.gz | gzip -d | xbstream -x -C /restore/
2. 恢復 (Prepare + Copy-back)
# 1. 停止 MySQL
systemctl stop mysqld
# 2. 備份原數據目錄 (保留回滾路徑)
mv /var/lib/mysql /var/lib/mysql_bak_$(date +%F)
mkdir -p /var/lib/mysql
chown mysql:mysql /var/lib/mysql
# 3. Prepare (應用 Redo Log,使數據一致)
innobackupex --apply-log /data/backup/2024-01-15_10-30-00/
# 大數據量加速: --use-memory=4G
# 4. Copy-back (還原文件到 my.cnf 指定路徑)
innobackupex --copy-back /data/backup/2024-01-15_10-30-00/
chown -R mysql:mysql /var/lib/mysql /data/mysql/ibdata /data/mysql/iblogs
# 5. 啟動
systemctl start mysqld
五、增量備份與恢復
1. 增量備份鏈構建
# 基礎全備
innobackupex --user=root --password=xxx /data/backup/ → 生成目錄 full_0 (LSN 0 ~ 1000)
# 業務寫入...
# 增量 1 (基於 full_0)
innobackupex --user=root --password=xxx --incremental /data/backup/ --incremental-basedir=/data/backup/full_0 → inc_1 (LSN 1000 ~ 2000)
# 業務寫入...
# 增量 2 (基於 inc_1)
innobackupex --user=root --password=xxx --incremental /data/backup/ --incremental-basedir=/data/backup/inc_1 → inc_2 (LSN 2000 ~ 3000)
# 查看 LSN 遞增關系
cat /data/backup/full_0/xtrabackup_checkpoints
# backup_type = full-prepared
# from_lsn = 0, to_lsn = 1000, last_lsn = 1000
cat /data/backup/inc_1/xtrabackup_checkpoints
# backup_type = incremental, from_lsn = 1000, to_lsn = 2000
cat /data/backup/inc_2/xtrabackup_checkpoints
# backup_type = incremental, from_lsn = 2000, to_lsn = 3000
2. 增量合並恢復 (關鍵:--redo-only)
# 1. 基礎全備 Prepare (--redo-only 只前滾,不回滾未提交事務)
innobackupex --apply-log --redo-only /data/backup/full_0/
# 2. 合並增量 1
innobackupex --apply-log --redo-only --incremental /data/backup/full_0/ --incremental-dir=/data/backup/inc_1/
# 3. 合並增量 2 (最後一個增量可不加 --redo-only,或加上再單獨做一次不帶 --redo-only 的 apply-log)
innobackupex --apply-log --redo-only --incremental /data/backup/full_0/ --incremental-dir=/data/backup/inc_2/
# 4. 最後執行一次完整 apply-log (確保未提交事務回滾)
innobackupex --apply-log /data/backup/full_0/
# 5. Copy-back + 啟動 (同全量恢復步驟 4-5)
六、innobackupex 常用參數速查
| 參數 | 說明 |
--defaults-file | 指定 my.cnf 路徑,必須在首位 |
--apply-log | Prepare 階段,等價 xtrabackup --prepare |
--copy-back | 恢復階段,拷貝文件到 datadir/innodb_data_home_dir 等 |
--incremental | 增量備份模式 |
--incremental-basedir | 基礎備份目錄 (全備或上一級增量) |
--incremental-dir | 增量備份輸出目錄 |
--redo-only | 合並增量時只 Redo,不 Undo,保證增量鏈一致性 |
--use-memory=4G | Prepare 階段內存限制,加速大庫恢復 |
--stream=xbstream | 流式輸出,配合 xbstream/gzip 跨機傳輸 |
--tmpdir | 臨時文件目錄 (避免 /tmp 空間不足) |
--throttle=10 | 限流 10 MB/s,減少備份對線上 I/O 影響 |
--slave-info | 備份從庫時記錄 Master 位點,生成 xtrabackup_slave_info 文件 |
--socket | 指定 mysql.sock 路徑 |
七、實戰避坑指南
- Prepare 階段必須在備份機/獨立環境執行,不可在線上庫直接
--apply-log,會破壞數據文件。
- 增量鏈斷裂不可用:LSN 必須連續,中間缺失增量需重新全備。
- MyISAM 表需 FTWRL:備份過程會短暫全局鎖,純 InnoDB 業務無感知。
- 流式備份臨時文件大:
xtrabackup_logfile 可能達數 GB,務必 --tmpdir 指向大磁盤分區。
- 版本匹配:XtraBackup 版本需兼容 MySQL 版本 (如 2.4 支持 5.6/5.7,8.0 需 8.0 版)。
- 備份驗證:定期在測試環境
--copy-back 驗證備份可用性,未驗證的備份不算備份。
八、對比 mysqldump:為什麼大庫必選 XtraBackup
| 維度 | mysqldump | XtraBackup |
| 備份速度 (TB 級) | 數小時~數十小時 | 數十分鐘~數小時 (物理拷貝) |
| 對線上影響 | 長時間鎖表/事務 | 極短 FTWRL (秒級) |
| 恢復速度 | 極慢 (SQL 重放) | 快 (文件拷貝 + 紅日志應用) |
| 增量備份 | 不支持 (靠 Binlog) | 原生支持 (LSN 增量) |
| 一致性 | 邏輯一致性 | 物理一致性 (Crash Recovery) |
| 跨版本/引擎遷移 | 支持 | 僅同主版本、同引擎 |
結論:500G+ 庫強制 XtraBackup;小庫、異構遷移、邏輯審計用 mysqldump。
- 上一篇文章: mysqldump 邏輯備份最佳實踐:從參數優化到搭建 Slave 與數據恢復全流程
- 下一篇文章: MySQL 游標使用詳解:聲明、遍歷、處理器與實戰案例
Copyright ©
程式碼之家 All Rights Reserved