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=1

mkdir -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" ]; then
    echo "[INFO] No full backup found, creating first full backup..."
    FULL_DIR=$BACKUP_DIR/full/$DATE
    mkdir -p $FULL_DIR
    xtrabackup --backup --target-dir=$FULL_DIR --user=$USER --password=$PASS
    xtrabackup --prepare --apply-log-only --target-dir=$FULL_DIR
    echo "[INFO] Full backup finished: $FULL_DIR"
    exit 0
fi

# 每天凌晨 0 点自动生成全量备份
HOUR=$(date +%H)
if [ "$HOUR" -eq "00" ]; then
    FULL_DIR=$BACKUP_DIR/full/$DATE
    mkdir -p $FULL_DIR
    echo "[INFO] Starting daily full backup..."
    xtrabackup --backup --target-dir=$FULL_DIR --user=$USER --password=$PASS
    xtrabackup --prepare --apply-log-only --target-dir=$FULL_DIR
    echo "[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" ]; then
    INC_BASE=$LAST_FULL
else
    INC_BASE=$LAST_INC
fi

INC_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; do
    tar -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. 注意事项

  1. 增量备份必须按时间顺序恢复
  2. 数据目录权限必须为 mysql:mysql
  3. 全量备份必须先 --prepare
  4. 恢复前备份原数据目录,防止误操作
  5. 压缩增量备份必须先解压再 apply

6. 建议

  • 日志记录备份状态,方便排查问题
  • 生产环境建议每天凌晨全量备份,其他时间增量备份
  • 定期测试恢复流程,保证备份可用
相关推荐
xie_pin_an2 小时前
Redis 核心命令速查表
数据库·redis·缓存
魏 无羡2 小时前
windows 安装mysql(多个版本同时安装)
windows·mysql·adb
苦学编程的谢3 小时前
Redis_11_类型补充+命令补充+RESP
数据库·redis·缓存
一 乐3 小时前
社区养老保障|智慧养老|基于springboot+小程序社区养老保障系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·小程序
hzk的学习笔记3 小时前
Redisson 和 Jedis 的区别
数据库·redis·缓存
dessler3 小时前
MYSQL-外键(Foreign Key)
linux·运维·mysql
q***98523 小时前
图文详述:MySQL的下载、安装、配置、使用
android·mysql·adb
我想吹水3 小时前
Django 测试样例
数据库·django·sqlite
Im5013 小时前
MySQL索引——从入门到出土
mysql