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

CentOS 生產環境推薦:Percona XtraBackup 熱備與增量備份實戰詳解

     編輯:MySQL 綜合教學

為什麼選 XtraBackup?

工具類型優點缺點適用場景
mysqldump邏輯備份跨版本、可編輯、單表恢復易大庫備份/恢復極慢,鎖表(MyISAM)< 50GB、異構遷移
LVM 快照物理備份近熱備、文件系統級操作複雜、難腳本化、需 LVM已用 LVM 的環境
XtraBackup物理熱備不阻塞寫入、速度快、支持增量、壓縮、流式傳輸、並行MyISAM 只能溫備、需 innodb_file_per_table、版本綁定InnoDB 大庫生產首選

一、安裝部署

Yum 安裝(推薦)

# 配置 Percona Yum 源
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable tools release

# 安裝 XtraBackup 2.4(5.7)或 8.0(8.0)
yum install -y percona-xtrabackup-24  # 5.7
# yum install -y percona-xtrabackup-80  # 8.0

# 驗證
xtrabackup --version
innobackupex --version

核心工具說明

  • xtrabackup:底層引擎,只備份 InnoDB,不含表結構
  • innobackupex:Perl 封裝腳本,支持 MyISAM、表結構、完整實例備份(**主力工具**)
  • xbstream:流式打包/解包,配合網絡傳輸
  • xbcrypt:加密/解密備份文件
  • xbcloud:雲存儲上傳/下載

二、關鍵參數詳解

參數作用典型用法
--apply-log準備備份:回滾未提交事務、重放已提交事務,使數據一致備份後必須執行,增量備份每層都要執行
--redo-only準備增量備份時僅重做,不回滾未提交事務基備+增量合併過程中,除最後一層外都加此參數
--copy-back還原:將備份文件複製回目標 datadir目標目錄必須為空,還原後修改權限
--incremental增量備份模式配合 --incremental-basedir 指定基準目錄
--stream=tar流式輸出到 stdout,配合管道壓縮/傳輸innobackupex --stream=tar /backup | gzip > backup.tar.gz
--parallel=N並行複製文件數(需 innodb_file_per_table)大庫加速,如 --parallel=4
--remote-host直接備份到遠程主機--remote-host=user@host /remote/path

三、備份與恢復實戰案例

3.1 全量備份 + 全量恢復

# 1. 全量備份
innobackupex --user=root --password='Pass123!' --no-timestamp /backup/full_base

# 2. 準備(使數據一致)
innobackupex --apply-log /backup/full_base

# === 模擬故障 ===
systemctl stop mysqld
rm -rf /data/mysql/*

# 3. 還原
innobackupex --copy-back /backup/full_base
chown -R mysql:mysql /data/mysql
systemctl start mysqld

3.2 全量 + 多級增量備份 + 恢復

# 0. 基準全量備份
innobackupex --user=root --password='Pass123!' /backup
# 假設生成 /backup/2023-01-01_00-00-00

# 1. 第一次增量
innobackupex --user=root --password='Pass123!' --incremental /backup \
  --incremental-basedir=/backup/2023-01-01_00-00-00
# 生成 /backup/2023-01-01_01-00-00

# 2. 第二次增量(基於上一次增量)
innobackupex --user=root --password='Pass123!' --incremental /backup \
  --incremental-basedir=/backup/2023-01-01_01-00-00
# 生成 /backup/2023-01-01_02-00-00

# === 準備階段:由基向增量順序合併 ===
# 基備重做
innobackupex --apply-log --redo-only /backup/2023-01-01_00-00-00

# 第一增量重做
innobackupex --apply-log --redo-only /backup/2023-01-01_00-00-00 \
  --incremental-dir=/backup/2023-01-01_01-00-00

# 第二增量重做(最後一層可不加 --redo-only,或加上再最後執行一次無參數 apply-log)
innobackupex --apply-log --redo-only /backup/2023-01-01_00-00-00 \
  --incremental-dir=/backup/2023-01-01_02-00-00

# 最終統一準備(可選,確保徹底一致)
innobackupex --apply-log /backup/2023-01-01_00-00-00

# === 還原 ===
systemctl stop mysqld
rm -rf /data/mysql/*
innobackupex --copy-back /backup/2023-01-01_00-00-00
chown -R mysql:mysql /data/mysql
systemctl start mysqld

四、高級功能實戰

4.1 流式壓縮備份到本地/遠程

# 本地壓縮
innobackupex --user=root --password='Pass123!' --stream=tar /backup | gzip > /backup/full_$(date +%F_%H-%M-%S).tar.gz

# 遠程直接傳輸(強烈推薦,無本地落盤壓力)
innobackupex --user=root --password='Pass123!' --stream=tar /backup | \
  ssh backup_user@backup_server "cat > /backup/mysql/full_$(date +%F_%H-%M-%S).tar"

4.2 並行備份加速

innobackupex --user=root --password='Pass123!' --parallel=4 /backup
# 需 innodb_file_per_table=ON,多表空間文件並行複製

4.3 部分備份(單庫/單表)

# 方式 1:正則匹配表名(需 innodb_file_per_table)
innobackupex --user=root --password='Pass123!' --include='^mydb\.t_' /backup

# 方式 2:文件列表
echo -e 'mydb.t1\nmydb.t2' > /tmp/tables.txt
innobackupex --user=root --password='Pass123!' --tables-file=/tmp/tables.txt /backup

# 方式 3:指定庫(含所有表)
innobackupex --user=root --password='Pass123!' --databases='mydb testdb' /backup

部分備份還原:無法直接 --copy-back,需 --apply-log --export 產生 .cfg/.ibd,再在目標庫 CREATE TABLE ... DISCARD TABLESPACE; ALTER TABLE ... IMPORT TABLESPACE; 導入。

4.4 單表導出導入(跨實例遷移表)

# 源庫:備份並導出
innobackupex --user=root --password='Pass123!' --databases='mydb.t1' /backup
innobackupex --apply-log --export /backup/2023-01-01_00-00-00
# 產生 t1.ibd, t1.cfg (5.7) 或 t1.sdi (8.0)

# 目標庫:建表結構、棄用表空間、導入
# 1. 獲取建表語句
SHOW CREATE TABLE mydb.t1;
# 2. 目標庫建表
CREATE TABLE mydb.t1 (...) ENGINE=InnoDB;
# 3. 棄用表空間
ALTER TABLE mydb.t1 DISCARD TABLESPACE;
# 4. 複製 ibd/cfg 到目標 datadir/mydb/
# 5. 導入表空間
ALTER TABLE mydb.t1 IMPORT TABLESPACE;

五、定時備份策略建議

# crontab -e
# 每日 02:00 全量備份(流式壓縮上傳異地)
0 2 * * * /scripts/xtrabackup_full.sh >> /var/log/xtrabackup_full.log 2>&1

# 每 6 小時增量備份
0 */6 * * * /scripts/xtrabackup_incr.sh >> /var/log/xtrabackup_incr.log 2>&1

xtrabackup_incr.sh 關鍵邏輯:自動尋找最新基備/增量目錄作為 --incremental-basedir。

六、避坑指南

  • 版本匹配:XtraBackup 版本必須與 MySQL 大版本對應(2.4→5.7, 8.0→8.0)
  • innodb_file_per_table=ON:增量、部分備份、並行、單表導入的前提
  • 權限:備份用戶需 RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT 等權限
  • 磁盤空間:準備階段需額外空間合併增量,預留 1.5 倍備份大小
  • 還原後:必須 chown -R mysql:mysql,檢查 innodb_log_file_size 與配置一致
  • 定期演練:每季度至少一次全量+增量鏈路恢復演練
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved