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

Percona XtraBackup 實戰:MySQL 在線熱備份、增量備份與極速恢復全流程

     編輯:MySQL 綜合教學

Percona XtraBackup 實戰:MySQL 在線熱備份、增量備份與極速恢復全流程

XtraBackup 是 Percona 開源的物理熱備份工具,支持 InnoDB/XtraDB 非阻塞備份、MyISAM 鎖表備份、增量備份、流式傳輸、壓縮加密、備份驗證。本文覆蓋安裝部署、全量/增量備份恢復、核心參數、MyISAM 一致性處理、實戰避坑。

一、核心組件與原理

組件功能
xtrabackupC 編譯主程序,執行物理文件拷貝、Redo Log 尾隨拷貝、Prepare 階段應用 Redo Log (Crash Recovery)
innobackupexPerl 封裝腳本 (2.3 版為符號鏈接,已棄用),協調 MyISAM 鎖表、調用 xtrabackup、複製 .frm/.opt 等元數據
xbstream流式打包/解包工具,支持並行、壓縮、加密傳輸
xbcrypt備份文件加密/解密
xbcloud雲存儲 (S3/MinIO/Azure) 上傳下載

工作原理:

  1. 啟動記錄 LSN (Log Sequence Number)。
  2. 拷貝數據文件 (.ibd, .frm 等) — 過程中數據可能變更。
  3. 後台線程持續尾隨拷貝 Redo Log (循環寫入,必須跟上)。
  4. 拷貝完成 → FLUSH TABLES WITH READ LOCK (FTWRL) → 拷貝 MyISAM/系統表 → 釋放鎖。
  5. 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-logPrepare 階段,等價 xtrabackup --prepare
--copy-back恢復階段,拷貝文件到 datadir/innodb_data_home_dir 等
--incremental增量備份模式
--incremental-basedir基礎備份目錄 (全備或上一級增量)
--incremental-dir增量備份輸出目錄
--redo-only合並增量時只 Redo,不 Undo,保證增量鏈一致性
--use-memory=4GPrepare 階段內存限制,加速大庫恢復
--stream=xbstream流式輸出,配合 xbstream/gzip 跨機傳輸
--tmpdir臨時文件目錄 (避免 /tmp 空間不足)
--throttle=10限流 10 MB/s,減少備份對線上 I/O 影響
--slave-info備份從庫時記錄 Master 位點,生成 xtrabackup_slave_info 文件
--socket指定 mysql.sock 路徑

七、實戰避坑指南

  1. Prepare 階段必須在備份機/獨立環境執行,不可在線上庫直接 --apply-log,會破壞數據文件。
  2. 增量鏈斷裂不可用:LSN 必須連續,中間缺失增量需重新全備。
  3. MyISAM 表需 FTWRL:備份過程會短暫全局鎖,純 InnoDB 業務無感知。
  4. 流式備份臨時文件大:xtrabackup_logfile 可能達數 GB,務必 --tmpdir 指向大磁盤分區。
  5. 版本匹配:XtraBackup 版本需兼容 MySQL 版本 (如 2.4 支持 5.6/5.7,8.0 需 8.0 版)。
  6. 備份驗證:定期在測試環境 --copy-back 驗證備份可用性,未驗證的備份不算備份。

八、對比 mysqldump:為什麼大庫必選 XtraBackup

結論:500G+ 庫強制 XtraBackup;小庫、異構遷移、邏輯審計用 mysqldump。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度mysqldumpXtraBackup
備份速度 (TB 級)數小時~數十小時數十分鐘~數小時 (物理拷貝)
對線上影響長時間鎖表/事務極短 FTWRL (秒級)
恢復速度極慢 (SQL 重放)快 (文件拷貝 + 紅日志應用)
增量備份不支持 (靠 Binlog)原生支持 (LSN 增量)
一致性邏輯一致性物理一致性 (Crash Recovery)
跨版本/引擎遷移支持僅同主版本、同引擎