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

XtraBackup 實現 MySQL 熱備份腳本:全量/增量策略、恢復流程與自動化部署

     編輯:MySQL 綜合教學

一、XtraBackup 原理速覽

  • InnoDB 熱備份:多線程拷貝 .ibd 文件,同時監聽 redo log 變化寫入 xtrabackup_logfile
  • Prepare 階段:類似崩潰恢復,應用 redo log 使數據文件一致,回滾未提交事務
  • 非 InnoDB 表:需 FLUSH TABLES WITH READ LOCK 獲取全域鎖,拷貝 .frm/.MYD/.MYI 等文件
  • 工具鏈:xtrabackup (核心) + innobackupex (Perl 封裝,支援 MyISAM、結構備份)

二、安裝部署 (RHEL/CentOS 6/7)

# 方式 1: RPM 直接安裝
wget https://www.percona.com/downloads/XtraBackup/LATEST/RPM/rhel6/x86_64/percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm
yum install -y perl-DBD-MySQL perl-DBI perl-Time-HiRes libaio
rpm -ivh percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm

# 方式 2: Percona Yum 源
rpm -Uhv https://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
yum -y install percona-xtrabackup

# 驗證
rpm -ql percona-xtrabackup | grep bin
# /usr/bin/innobackupex
# /usr/bin/xtrabackup
# /usr/bin/xbstream
# /usr/bin/xbcrypt

三、生產級備份腳本 (全量 + 增量 + 自動清理)

#!/bin/bash
# /data/scripts/mysql_backup.sh
# 用法: mysql_backup.sh full | inc | help

# ========== 配置區 ==========
BACKUP_BASE_DIR="/data/mysql_backup"
INC_BASE_LIST="${BACKUP_BASE_DIR}/incremental_basedir_list.txt"
XTRABACKUP_CMD="/usr/local/xtrabackup/bin/innobackupex"
MYSQL_CNF="/etc/my.cnf"
THREADS=6
RETENTION_DAYS=14
# ============================

print_help() {
  echo "Usage: $0 full | inc | help"
  exit 1
}

[[ $# -lt 1 ]] && print_help
[[ -d $BACKUP_BASE_DIR ]] || mkdir -p $BACKUP_BASE_DIR

# 當前備份目錄 (精確到分鐘,衝突則加秒)
CURRENT_BAK="${BACKUP_BASE_DIR}/$(date +%F_%H-%M)"
[[ -d $CURRENT_BAK ]] && CURRENT_BAK="${BACKUP_BASE_DIR}/$(date +%F_%H-%M-%S)"

# ========== 全量備份 ==========
do_full() {
  $XTRABACKUP_CMD --user=root --defaults-file=$MYSQL_CNF --parallel=$THREADS --no-timestamp $CURRENT_BAK
  echo "NULL|$CURRENT_BAK|full" >> $INC_BASE_LIST
}

# ========== 增量備份 ==========
do_inc() {
  # 無基準列表或列表為空 → 全量
  if [[ ! -f $INC_BASE_LIST || $(sed '/^$/d' $INC_BASE_LIST | wc -l) -eq 0 ]]; then
    do_full
    return
  fi
  
  # 無任何備份目錄 → 全量
  if [[ $(find $BACKUP_BASE_DIR -maxdepth 1 -type d | wc -l) -eq 1 ]]; then
    do_full
    return
  fi
  
  # 獲取上一次備份目錄
  PREV_BAK=$(sed '/^$/d' $INC_BASE_LIST | tail -1 | awk -F'|' '{print $2}')
  
  # 上次目錄不存在或為空 → 全量 (防惡意刪除)
  if [[ ! -d $PREV_BAK || -z $(ls $PREV_BAK) ]]; then
    do_full
    return
  fi
  
  # 正常增量
  $XTRABACKUP_CMD --user=root --defaults-file=$MYSQL_CNF --parallel=$THREADS --no-timestamp \
    --incremental $CURRENT_BAK --incremental-basedir=$PREV_BAK
  echo "$PREV_BAK|$CURRENT_BAK|inc" >> $INC_BASE_LIST
}

# ========== 主邏輯 ==========
case $1 in
  full) do_full ;;
  inc)  do_inc ;;
  help) print_help ;;
  *)    print_help ;;
esac

# ========== 清理舊備份 ==========
find $BACKUP_BASE_DIR -maxdepth 1 -type d -name "$(date -d "$RETENTION_DAYS days ago" +%F)_*" -exec rm -rf {} \;
sed -i "/$(date -d "$RETENTION_DAYS days ago" +%F)/d" $INC_BASE_LIST

# ========== 恢復流程說明 (註釋) ==========
: <<'RECOVERY_GUIDE'
# 1. 應用基準全量備份 (--redo-only)
innobackupex --user=root --defaults-file=/etc/my.cnf --use-memory=8G --apply-log --redo-only /data/mysql_backup/full

# 2. 應用第一個增量 (--redo-only)
innobackupex --user=root --defaults-file=/etc/my.cnf --use-memory=8G --apply-log --redo-only /data/mysql_backup/full --incremental-dir=/data/mysql_backup/inc1

# 3. 應用第二個增量 (最後一個增量不加 --redo-only)
innobackupex --user=root --defaults-file=/etc/my.cnf --use-memory=8G --apply-log /data/mysql_backup/full --incremental-dir=/data/mysql_backup/inc2

# 4. 最後再次應用基準
innobackupex --user=root --defaults-file=/etc/my.cnf --use-memory=8G --apply-log /data/mysql_backup/full

# 5. 恢復數據目錄
innobackupex --user=root --defaults-file=/etc/my.cnf --copy-back /data/mysql_backup/full
# 修正權限: chown -R mysql:mysql /var/lib/mysql
# 啟動 MySQL
RECOVERY_GUIDE

四、Crontab 定時任務配置

# 每天 04:20 全量備份
20 4 * * * /data/scripts/mysql_backup.sh full >/dev/null 2>&1

# 每小時整點增量備份
0 * * * * /data/scripts/mysql_backup.sh inc >/dev/null 2>&1

五、關鍵參數調優建議

參數建議值說明
--parallelCPU 核心數 × 0.75拷貝並行度,避免佔滿 I/O
--use-memory4G-8G (準備階段)Prepare 時內存緩存,加速 redo log 應用
--throttle100-200 (MB/s)限制 I/O 頻寬,保護線上業務
--compress可選備份文件壓縮,節省空間,CPU 換 I/O
--encrypt=AES256可選備份加密,需管理金鑰

六、常見坑點與避坑

  1. 增量備份鏈斷裂:腳本自動檢測上級目錄不存在則降級全量,保證鏈完整
  2. Prepare 失敗:通常因 redo log 損壞或版本不匹配,xtrabackup --version 需與 MySQL 版本兼容
  3. 權限問題:備份用戶需 RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT 權限
  4. 大表備份慢:啟用 --parallel、考慮分庫並行備份、或用 xbstream 並行流式傳輸
  5. MyISAM 表鎖久:業務低峰期執行全量備份,或遷移至 InnoDB

七、總結

  1. XtraBackup 是 **InnoDB 熱備份標準工具**,支援全量/增量/流式/壓縮/加密
  2. 腳本實現 **全量日備 + 增量小時備 + 14天保留**,單腳本參數化操作
  3. 恢復流程:**基準 → 增量1 (redo-only) → 增量N → 基準 → copy-back**,嚴格遵循順序
  4. 生產環境建議:**定期演練恢復**、**異地備份**、**監控備份耗時/大小異常告警**
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved