MySQL XtraBackup 使用文档(全量 + 增量备份与恢复)
MySQL XtraBackup 使用文档(全量 + 增量备份与恢复)
1. 环境说明
- OS: CentOS 7
- MySQL: 5.7 或 8.0
- 工具: Percona XtraBackup
- 数据目录默认:
/var/lib/mysql - 备份目录示例:
/data/backup/mysql
2. 安装 XtraBackup
2.1 配置 MySQL 官方仓库(可选阿里云镜像)
# 安装基础依赖
yum install -y wget curl lsof# 下载仓库 rpm 包
wget https://repo.percona.com/yum/percona-release-latest.noarch.rpm# 安装仓库
rpm -ivh percona-release-latest.noarch.rpm# 启用 Percona 仓库
percona-release setup ps57 # 适用于 MySQL 5.7
2.2 安装 XtraBackup
yum install -y percona-xtrabackup-80
安装后可验证版本:
xtrabackup --version
3. 生产环境备份配置
3.1 目录结构
/data/backup/mysql/
├── full/ # 全量备份
├── incremental/ # 增量备份
└── logs/ # 日志
3.2 脚本示例(每 5 分钟执行一次)
#!/bin/bash
USER="root"
PASS="Root@1234"
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M)
FULL_RETENTION_DAYS=7
INC_RETENTION_DAYS=1mkdir -p $BACKUP_DIR/full $BACKUP_DIR/incremental $BACKUP_DIR/logs
LOG_FILE="$BACKUP_DIR/logs/backup_$(date +%Y%m%d).log"
exec >> $LOG_FILE 2>&1
echo "===== Backup Start: $(date) ====="# 清理过期备份
find $BACKUP_DIR/full/ -type d -mtime +$FULL_RETENTION_DAYS -exec rm -rf {} \;
find $BACKUP_DIR/incremental/ -type d -mtime +$INC_RETENTION_DAYS -exec rm -rf {} \;# 查找最新全量备份
LAST_FULL=$(ls -1d $BACKUP_DIR/full/* 2>/dev/null | sort | tail -n1)if [ -z "$LAST_FULL" ]; thenecho "[INFO] No full backup found, creating first full backup..."FULL_DIR=$BACKUP_DIR/full/$DATEmkdir -p $FULL_DIRxtrabackup --backup --target-dir=$FULL_DIR --user=$USER --password=$PASSxtrabackup --prepare --apply-log-only --target-dir=$FULL_DIRecho "[INFO] Full backup finished: $FULL_DIR"exit 0
fi# 每天凌晨 0 点自动生成全量备份
HOUR=$(date +%H)
if [ "$HOUR" -eq "00" ]; thenFULL_DIR=$BACKUP_DIR/full/$DATEmkdir -p $FULL_DIRecho "[INFO] Starting daily full backup..."xtrabackup --backup --target-dir=$FULL_DIR --user=$USER --password=$PASSxtrabackup --prepare --apply-log-only --target-dir=$FULL_DIRecho "[INFO] Daily full backup finished: $FULL_DIR"exit 0
fi# 增量备份
LAST_INC=$(ls -1d $BACKUP_DIR/incremental/* 2>/dev/null | sort | tail -n1)
if [ -z "$LAST_INC" ]; thenINC_BASE=$LAST_FULL
elseINC_BASE=$LAST_INC
fiINC_DIR=$BACKUP_DIR/incremental/$DATE
mkdir -p $INC_DIR
echo "[INFO] Starting incremental backup..."
xtrabackup --backup --target-dir=$INC_DIR --incremental-basedir=$INC_BASE --user=$USER --password=$PASS# 压缩增量备份
tar -czf ${INC_DIR}.tar.gz -C $BACKUP_DIR/incremental $(basename $INC_DIR)
rm -rf $INC_DIR
echo "[INFO] Incremental backup finished and compressed: ${INC_DIR}.tar.gz"
echo "===== Backup End: $(date) ====="
3.3 配置 cron
*/5 * * * * /bin/bash /usr/local/bin/mysql_backup_prod.sh
4. 恢复 MySQL 数据
4.1 停止 MySQL
systemctl stop mysqld
4.2 恢复全量备份
FULL_DIR=/data/backup/mysql/full/20251112_0000# Prepare 全量备份
xtrabackup --prepare --apply-log-only --target-dir=$FULL_DIR# 清空 MySQL 数据目录
mv /var/lib/mysql /var/lib/mysql_old_$(date +%F_%H%M)
mkdir -p /var/lib/mysql# Copy-back
xtrabackup --copy-back --target-dir=$FULL_DIR
chown -R mysql:mysql /var/lib/mysql
chmod 700 /var/lib/mysql
4.3 恢复增量备份(按顺序)
# 解压增量备份
cd /data/backup/mysql/incremental
for f in *.tar.gz; dotar -xzf $f
done# 按时间顺序应用增量
xtrabackup --prepare --apply-log-only --target-dir=$FULL_DIR --incremental-dir=/data/backup/mysql/incremental/20251112_0100
xtrabackup --prepare --apply-log-only --target-dir=$FULL_DIR --incremental-dir=/data/backup/mysql/incremental/20251112_0200
4.4 启动 MySQL
systemctl start mysqld# 检查数据库
mysql -uroot -p -e "SHOW DATABASES;"
5. 注意事项
- 增量备份必须按时间顺序恢复
- 数据目录权限必须为 mysql:mysql
- 全量备份必须先 --prepare
- 恢复前备份原数据目录,防止误操作
- 压缩增量备份必须先解压再 apply
6. 建议
- 日志记录备份状态,方便排查问题
- 生产环境建议每天凌晨全量备份,其他时间增量备份
- 定期测试恢复流程,保证备份可用
