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

XtraBackup 熱備份工具完整指南:安裝、備份、恢復與增量策略

     編輯:MySQL 資料庫相關知識

XtraBackup 核心優勢

  • 熱備份:InnoDB/XtraDB 表無需鎖表,業務零停機
  • 增量備份:僅備份變更頁面,大幅節省空間與時間
  • 壓縮/流式:支援 tar/gzip 流式傳輸,便於異地備份
  • 免費開源:Percona 維護,InnoDB Hot Backup 的免費替代品

工具組件對比

工具支援引擎鎖表行為適用場景
xtrabackupInnoDB/XtraDB無鎖 (熱備份)純 InnoDB 環境、追求極致性能
innobackupexInnoDB + MyISAMMyISAM 需全局讀鎖混合引擎環境、生產通用首選

建議:現代 MySQL 以 InnoDB 為主,優先使用 innobackupex (8.0+ 併入 xtrabackup --backup)。

安裝部署

方式一:Percona 官方倉庫 (推薦,自動解決依賴)

# CentOS/RHEL 7/8
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable tools release
yum install -y percona-xtrabackup-80  # MySQL 8.0 用 80,5.7 用 24

# Ubuntu/Debian
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
dpkg -i percona-release_latest.generic_all.deb
apt update
apt install -y percona-xtrabackup-80

方式二:二進制包手動安裝

# 下載對應版本
wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.33-29/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.33-29.el7.x86_64.rpm
rpm -ivh percona-xtrabackup-80-*.rpm

驗證安裝

xtrabackup --version
innobackupex --version  # 8.0 版本可能無此命令

核心備份操作

1. 完整備份 (最常用)

# 基本語法
innobackupex --user=root --password=xxx --defaults-file=/etc/my.cnf /backup/full/

# 生產推薦參數
innobackupex \
  --user=backup_user \
  --password='strong_pass' \
  --defaults-file=/etc/my.cnf \
  --no-timestamp \
  --parallel=4 \
  --compress \
  --compress-threads=4 \
  /backup/full_$(date +%F)

2. 串流備份 + 壓縮 (異地傳輸首選)

# 本地壓縮存儲
innobackupex --stream=tar /backup/ | gzip > /backup/full_$(date +%F).tar.gz

# 遠程傳輸 (SSH)
innobackupex --stream=tar /backup/ | gzip | ssh user@remote "cat > /remote/backup/full_$(date +%F).tar.gz"

# 含從庫資訊 (便於重建主從)
innobackupex --slave-info --stream=tar /backup/ | gzip > backup.tar.gz

3. 增量備份 (節省空間核心)

# 步驟 1:建立基準全量備份
innobackupex --user=root --password=xxx /backup/base/

# 假設基準目錄為 /backup/base/2024-01-15_10-00-00

# 步驟 2:增量備份 (基於上一次備份)
innobackupex --user=root --password=xxx \
  --incremental /backup/inc/ \
  --incremental-basedir=/backup/base/2024-01-15_10-00-00

# 步驟 3:後續增量 (基於上一次增量)
innobackupex --user=root --password=xxx \
  --incremental /backup/inc2/ \
  --incremental-basedir=/backup/inc/2024-01-15_12-00-00

恢復操作 (關鍵:prepare 階段)

完整備份恢復

# 1. 停止 MySQL
systemctl stop mysqld

# 2. 清空數據目錄 (謹慎!)
rm -rf /var/lib/mysql/*

# 3. 應用日志 (使備份數據一致性) - 關鍵步驟
innobackupex --apply-log /backup/full_2024-01-15_10-00-00/

# 4. 複製回數據目錄
innobackupex --copy-back /backup/full_2024-01-15_10-00-00/

# 5. 修正權限
chown -R mysql:mysql /var/lib/mysql

# 6. 啟動 MySQL
systemctl start mysqld

增量備份恢復 (完整流程)

# 1. 準備基準全量備份
innobackupex --apply-log --redo-only /backup/base/2024-01-15_10-00-00/

# 2. 合併第一個增量
innobackupex --apply-log --redo-only /backup/base/2024-01-15_10-00-00/ \
  --incremental-dir=/backup/inc/2024-01-15_12-00-00/

# 3. 合併第二個增量 (以此類推)
innobackupex --apply-log --redo-only /backup/base/2024-01-15_10-00-00/ \
  --incremental-dir=/backup/inc2/2024-01-15_14-00-00/

# 4. 最後一次不加 --redo-only
innobackupex --apply-log /backup/base/2024-01-15_10-00-00/

# 5. 複製回並啟動
innobackupex --copy-back /backup/base/2024-01-15_10-00-00/
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

串流壓縮備份恢復

# 1. 解壓
mkdir /backup/restore
tar -xzf /backup/full_2024-01-15.tar.gz -C /backup/restore/

# 2. 準備與恢復 (同完整備份)
innobackupex --apply-log /backup/restore/
innobackupex --copy-back /backup/restore/
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

xtrabackup 原生命令 (進階用戶)

# 完整備份
xtrabackup --backup --target-dir=/backup/full/ --datadir=/var/lib/mysql

# 增量備份
xtrabackup --backup --target-dir=/backup/inc/ --incremental-basedir=/backup/full/

# 準備 (需執行兩次)
xtrabackup --prepare --target-dir=/backup/full/
xtrabackup --prepare --target-dir=/backup/full/

# 恢復 (需手動複製 .ibd/.frm 文件)
# 注意:xtrabackup 不備份 .frm 表結構文件,需額外備份

自動化備份腳本範例

#!/bin/bash
# /usr/local/bin/mysql_backup.sh
# 每日 02:00 執行完整備份,每 4 小時增量

BACKUP_ROOT="/backup/mysql"
FULL_DIR="$BACKUP_ROOT/full"
INC_DIR="$BACKUP_ROOT/inc"
MY_CNF="/etc/my.cnf"
USER="backup_user"
PASS="xxx"
RETENTION_DAYS=7

# 找到最新的基準備份
latest_full=$(ls -1dt $FULL_DIR/*/ 2>/dev/null | head -1)
latest_inc=$(ls -1dt $INC_DIR/*/ 2>/dev/null | head -1)

if [ -z "$latest_full" ] || [ $(find "$latest_full" -mtime +1 -print) ]; then
    # 執行完整備份
    innobackupex --user=$USER --password=$PASS --defaults-file=$MY_CNF \
      --no-timestamp --compress --parallel=4 $FULL_DIR/full_$(date +%F_%H-%M)
else
    # 執行增量備份
    base_dir=${latest_inc:-$latest_full}
    innobackupex --user=$USER --password=$PASS --defaults-file=$MY_CNF \
      --no-timestamp --incremental $INC_DIR/inc_$(date +%F_%H-%M) \
      --incremental-basedir=$base_dir
fi

# 清理舊備份
find $BACKUP_ROOT -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;

關鍵注意事項

  1. 備份用戶權限:RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE
  2. 磁盤空間:prepare 階段需額外空間,預留 1.5 倍備份大小
  3. 版本匹配:XtraBackup 版本必須與 MySQL 版本對應 (8.0/5.7/5.6)
  4. MyISAM 表:會加全局讀鎖,影響寫入,評估業務可接受窗口
  5. 加密表:需提供 --keyring-file-data 參數
  6. 定期演練恢復:未測試的備份 = 無備份,每季度至少一次全量恢復演練

監控與告警

# 關鍵指標監控
# 1. 備份耗時超過閾值告警
# 2. 備份文件大小異常變化 (可能數據異常)
# 3. 備份失敗退出碼非 0
# 4. 恢復演練 RTO/RPO 指標
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved