一、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
五、關鍵參數調優建議
| 參數 | 建議值 | 說明 |
--parallel | CPU 核心數 × 0.75 | 拷貝並行度,避免佔滿 I/O |
--use-memory | 4G-8G (準備階段) | Prepare 時內存緩存,加速 redo log 應用 |
--throttle | 100-200 (MB/s) | 限制 I/O 頻寬,保護線上業務 |
--compress | 可選 | 備份文件壓縮,節省空間,CPU 換 I/O |
--encrypt=AES256 | 可選 | 備份加密,需管理金鑰 |
六、常見坑點與避坑
- 增量備份鏈斷裂:腳本自動檢測上級目錄不存在則降級全量,保證鏈完整
- Prepare 失敗:通常因 redo log 損壞或版本不匹配,
xtrabackup --version 需與 MySQL 版本兼容
- 權限問題:備份用戶需
RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT 權限
- 大表備份慢:啟用
--parallel、考慮分庫並行備份、或用 xbstream 並行流式傳輸
- MyISAM 表鎖久:業務低峰期執行全量備份,或遷移至 InnoDB
七、總結
- XtraBackup 是 **InnoDB 熱備份標準工具**,支援全量/增量/流式/壓縮/加密
- 腳本實現 **全量日備 + 增量小時備 + 14天保留**,單腳本參數化操作
- 恢復流程:**基準 → 增量1 (redo-only) → 增量N → 基準 → copy-back**,嚴格遵循順序
- 生產環境建議:**定期演練恢復**、**異地備份**、**監控備份耗時/大小異常告警**