舊版 XtraBackup 不支援 MySQL 5.7 的熱備份特性(如 redo log 格式變更、資料字典變更)。生產環境必須升級至 2.4.x 系列(本文以 2.4.4 為例),官方下載頁:Percona XtraBackup Downloads。
在 CentOS 6 / RHEL 6 環境下 rpm -ivh percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm 常報:
libev.so.4()(64bit) is needed by ...rpm -ivh ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/libev-4.15-1.el6.rf.x86_64.rpm
libnuma.so.1()(64bit) is needed by ...rpm -ivh https://mirror.centos.org/centos/6/os/x86_64/Packages/numactl-2.0.9-2.el6.x86_64.rpm
裝完上述兩包即可順利安裝 XtraBackup。
以下腳本支援壓縮備份、日誌記錄、成功/失敗狀態回寫,可直接納入 crontab 定時執行。
#!/bin/bash
# MySQL 完整備份腳本
# Author: 21yunwei
# Date: 2016-10-18
TIME=$(date +%F)
LOGFILE="/data/bakup/mysql_full_bak_time.log"
FULL_LOG="/data/bakup/fullbakup_logfile.log"
BAKDIR="/data/bakup"
USER="backup_user"
PASS="strong_password"
# 目錄與日誌檔預備
[ ! -d "$BAKDIR" ] && mkdir -p "$BAKDIR"
[ ! -f "$LOGFILE" ] && touch "$LOGFILE"
[ ! -f "$FULL_LOG" ] && touch "$FULL_LOG"
# 執行備份(--compress 啟用快速壓縮,需 2.4+ 版本)
innobackupex --defaults-file=/etc/my.cnf \
--user="$USER" --password="$PASS" \
--compress "$BAKDIR" \
2>&1 | tee -a "$FULL_LOG"
RET=$?
FINISH_TIME=$(date +%Y%m%d_%H%M%S)
if [ $RET -eq 0 ]; then
echo "MySQL full backup finished, time: $FINISH_TIME" >> "$LOGFILE"
else
echo "MySQL full backup FAILED, please check, time: $FINISH_TIME" >> "$LOGFILE"
exit 1
fi
| 參數 | 用途 |
|---|---|
--defaults-file | 指定 my.cnf 路徑,確保讀取正確的 datadir、socket 等設定 |
--compress | 啟用 qp(QuickLZ)即時壓縮,節省 60%~80% 備份空間,降低 I/O |
2>&1 | tee -a | 同時將 stdout/stderr 寫入終端與日誌檔,便於即時監控與事後追溯 |
RET=$? | 捕獲 innobackupex 結束碼,非 0 視為失敗並觸發告警 |
innobackupex --apply-log --redo-only 模擬準備階段,確認備份集完整可用。--apply-log 將備份集推進到一致狀態,再 --copy-back 還原至 datadir。chown -R mysql:mysql /var/lib/mysql 避免啟動失敗。| 現象 | 可能原因 | 對策 |
|---|---|---|
Error 24: Too many open files | 系統 ulimit -n 過小 | ulimit -n 65535 或修改 /etc/security/limits.conf |
| 備份極慢、CPU 飆高 | 未加 --compress 或並行度未調優 | 加 --compress --parallel=4 --throttle=200(視磁碟 IOPS 調整) |
還原後 InnoDB: Log file size mismatch | 目標實例 innodb_log_file_size 與備份來源不一致 | 還原前調整目標 my.cnf 使 innodb_log_file_size 一致,並刪除舊 ib_logfile* |