| 工具 | 支援引擎 | 鎖表行為 | 適用場景 |
|---|---|---|---|
| xtrabackup | InnoDB/XtraDB | 無鎖 (熱備份) | 純 InnoDB 環境、追求極致性能 |
| innobackupex | InnoDB + MyISAM | MyISAM 需全局讀鎖 | 混合引擎環境、生產通用首選 |
建議:現代 MySQL 以 InnoDB 為主,優先使用 innobackupex (8.0+ 併入 xtrabackup --backup)。
# 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 版本可能無此命令
# 基本語法
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)
# 本地壓縮存儲
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
# 步驟 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
# 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 --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. 備份耗時超過閾值告警
# 2. 備份文件大小異常變化 (可能數據異常)
# 3. 備份失敗退出碼非 0
# 4. 恢復演練 RTO/RPO 指標