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. 建议

  • 日志记录备份状态,方便排查问题
  • 生产环境建议每天凌晨全量备份,其他时间增量备份
  • 定期测试恢复流程,保证备份可用
相关推荐
曹牧15 小时前
C#:问号
前端·数据库·c#
奇树谦15 小时前
《现代 Key-Value 数据库原理:从 B+Tree 到 LSM Tree》-第五篇:现代数据库横向对比
数据库·lsm-tree
李白客15 小时前
分布式集群与数据库产业:从单机到集群的架构跃迁与市场重构
数据库·分布式·架构
福大大架构师每日一题16 小时前
Redis 8.10.0 正式发布:紧凑哈希、批量导入、备份恢复、流与时序能力全面升级
数据库·redis·哈希算法
雨晨源码(同名B站)16 小时前
基于深度学习YoloV11农业病害虫害检测系统 智慧农业信息化综合管理平台 (附源码+lw文档+ppt)
数据库·人工智能·深度学习·yolo·信息可视化
DBA小马哥17 小时前
向量数据库入门到进阶:Embedding、ANN算法与RAG落地的关键术语
数据库·算法·embedding
云和数据.ChenGuang17 小时前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
祈禾17 小时前
Redis三大特殊数据类型
运维·服务器·数据库·redis·笔记·缓存
东方护航数据恢复(深圳)17 小时前
MySQL_Oracle数据库崩溃修复全攻略_东方护航数据恢复深圳店
数据库·mysql·oracle
y = xⁿ18 小时前
一文掌握Redis常见八股
数据库·redis·缓存