首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

大數據量 MySQL 熱備份神器:XtraBackup/Innobackupex 實戰全指南

     編輯:MySQL 資料庫相關知識

為什麼選 XtraBackup?

當單庫超 10GB,mysqldump 導出耗時數小時、鎖表影響業務、恢復更慢。Percona XtraBackup 提供:

  • 物理熱備份:不鎖表 (InnoDB),拷貝數據文件 + Redo Log,秒級完成
  • 增量備份:基於 LSN (Log Sequence Number) 僅備份變更頁,極大縮小備份窗口
  • 流式傳輸:--stream=tar 直輸遠端/對象存儲,無需本地落盤
  • 並行壓縮:--compress --compress-threads=4 邊備份邊壓縮
  • MyISAM 兼容:innobackupex 封裝自動加全局讀鎖備份 MyISAM

安裝部署 (CentOS 7/8 / Rocky / AlmaLinux)

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

# 2. 安裝 xtrabackup (包含 innobackupex)
yum install -y percona-xtrabackup-80  # MySQL 8.0 兼容版
# 或 percona-xtrabackup-24 (MySQL 5.7)

# 3. 驗證
xtrabackup --version
innobackupex --version

核心配置:my.cnf 必備項

[mysqld]
datadir = /var/lib/mysql                # 必須顯式指定,否則 restore 失敗
innodb_log_file_size = 1G               # 與生產一致,否則 prepare 階段報錯
log_bin = mysql-bin
server_id = 1
gtid_mode = ON
enforce_gtid_consistency = ON

全量備份實戰

基本全備

innobackupex --defaults-file=/etc/my.cnf \
    --user=root --password='xxx' \
    --no-timestamp \
    /backup/full_20240501

產出目錄結構:
/backup/full_20240501/ 包含所有 .ibd, .frm, xtrabackup_checkpoints, xtrabackup_info, backup-my.cnf

單庫備份

innobackupex --defaults-file=/etc/my.cnf \
    --user=root --password='xxx' \
    --databases='app_db' \
    /backup/app_db_full

流式備份直傳遠端/壓縮 (推薦生產)

# 本地壓縮存儲
innobackupex --defaults-file=/etc/my.cnf \
    --user=root --password='xxx' \
    --stream=tar --compress --compress-threads=4 \
    /backup | gzip > /backup/full_$(date +%F_%H%M).tar.gz

# 直傳遠端服務器 (免密 SSH)
innobackupex --defaults-file=/etc/my.cnf \
    --user=root --password='xxx' \
    --stream=tar \
    /backup | ssh backup-user@10.0.0.2 "cat > /remote/backup/full_$(date +%F).tar"

增量備份策略

原理

InnoDB 每個頁有 LSN。全備記錄 to_lsn,增量備份僅拷貝 LSN > 上次 to_lsn 的頁。

操作步驟

# 1. 基準全備 (假設目錄 base_full)
innobackupex --defaults-file=/etc/my.cnf --user=root -p --no-timestamp /backup/base_full

# 2. 第一次增量 (基於 base_full)
innobackupex --defaults-file=/etc/my.cnf --user=root -p \
    --incremental-basedir=/backup/base_full \
    --incremental /backup/inc1

# 3. 第二次增量 (基於 inc1)
innobackupex --defaults-file=/etc/my.cnf --user=root -p \
    --incremental-basedir=/backup/inc1 \
    --incremental /backup/inc2

# 查看 LSN 鏈
cat /backup/base_full/xtrabackup_checkpoints
# backup_type = full-prepared
# from_lsn = 0
# to_lsn = 12345678

cat /backup/inc1/xtrabackup_checkpoints
# backup_type = incremental
# from_lsn = 12345678
# to_lsn = 12345890

恢復流程: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 --defaults-file=/etc/my.cnf --user=root -p \
    --apply-log /backup/full_20240501

# 4. Copy-back (拷貝文件到 datadir)
innobackupex --defaults-file=/etc/my.cnf --user=root -p \
    --copy-back /backup/full_20240501

# 5. 權限修正並啟動
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

增量恢復 (合併增量到全備再恢復)

# 1. Prepare 基準全備 (--redo-only 跳過 rollback 階段)
innobackupex --apply-log --redo-only /backup/base_full

# 2. 合併第一次增量
innobackupex --apply-log --redo-only /backup/base_full \
    --incremental-dir=/backup/inc1

# 3. 合併第二次增量
innobackupex --apply-log --redo-only /backup/base_full \
    --incremental-dir=/backup/inc2

# 4. 最後一次完整 prepare (不加 --redo-only,執行 rollback)
innobackupex --apply-log /backup/base_full

# 5. Copy-back & 啟動 (同全量恢復步驟 4-5)
innobackupex --copy-back /backup/base_full
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

單表恢復 (TIB - Transportable Tablespace)

MySQL 5.6+ / 8.0 支持 DISCARD/IMPORT TABLESPACE 單表導入:

# 1. 目標庫建空表結構
CREATE TABLE `app_db`.`user` LIKE `app_db`.`user`;

# 2. 丟棄表空間
ALTER TABLE `app_db`.`user` DISCARD TABLESPACE;

# 3. 拷貝備份中的 user.ibd + user.cfg (exp 文件) 到 datadir/app_db/
cp /backup/full_20240501/app_db/user.ibd /var/lib/mysql/app_db/
cp /backup/full_20240501/app_db/user.cfg /var/lib/mysql/app_db/

# 4. 導入表空間
ALTER TABLE `app_db`.`user` IMPORT TABLESPACE;

常用參數速查表

參數說明典型值
--defaults-file指定 my.cnf 路徑/etc/my.cnf
--user/--password連接認證root/xxx
--parallel=N並行拷貝線程數4-8 (CPU 核心數)
--compress啟用壓縮 (需 qpress)配合 --compress-threads
--throttle=IOPS限制讀取 IOPS,減輕業務影響100-200
--slave-info備份從庫時記錄主庫 Binlog 位點生成 xtrabackup_slave_info
--safe-slave-backup備份前停止 SQL 線程,確保一致性從庫備份推薦
--tmpdir臨時文件目錄 (流式備份時避免 /tmp 爆滿)/data/tmp
--use-memory=GBprepare 階段內存分配4G-8G

監控與告警

  • 備份腳本返回碼非 0 立即告警
  • 監控 xtrabackup_checkpoints 中 to_lsn 增長正常
  • 定期校驗:每月隨機恢復單表驗證數據完整性
  • 備份存儲:異地多副本 (對象存儲 + 異地機房),保留策略:全備 30 天、增量 7 天

避坑指南

  1. 版本匹配:xtrabackup 版本必須與 MySQL 大版本對應 (80→8.0, 24→5.7)
  2. innodb_log_file_size 一致:備份機與生產機配置必須一致,否則 prepare 報錯
  3. datadir 必須配置:缺失導致 innobackupex: fatal error: no 'datadir' option
  4. 大表準備階段久:--use-memory 分配足夠內存加速
  5. MyISAM 仍需鎖表:混合引擎庫備份期間會有短暫全局讀鎖

XtraBackup 是 MySQL 大數據量備份的行業標準配置,掌握其增量鏈合併、單表導入、流式傳輸等進階用法,能構建 RPO<5min、RTO<30min 的企業級備份體系。

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