Xtrabackup 基础备份与恢复

Updated on with 0 views and 0 comments

Xtrabackup 基础备份与恢复

image.png

一、前期准备

1.1 环境说明

  • 数据库:MySQL8.0(Docker)
  • 数据目录:/data/mysql/data
  • 工具简介:Percona-XtraBackup8.0,InnoDB专用物理热备;备份无需停机、无需锁表,支持全量/增量备份,用于数据误删、故障回滚

1.2 工具安装(CentOS 阿里云源,解决官网无法下载问题)

# 使用阿里云镜像安装,规避官方源访问失败问题
yum install -y https://mirrors.aliyun.com/percona/yum/percona-release-latest.noarch.rpm
percona-release enable tools release
yum clean all && yum makecache
yum install -y percona-xtrabackup-80

# 验证是否安装成功
xtrabackup --version

二、备份机制

2.1 备份类型

  • 全量备份:备份实例所有库表数据,可独立恢复;目录格式:full_年月日,例:full_20260613
  • 增量备份:仅备份相较基准全量备份变更的数据页;体积小、速度快;无法单独恢复,必须合并全量;目录格式:inc_年月日时分,例:inc_202606131530

2.2 运维备份策略

  • 每周日凌晨01:00:执行一次全量备份
  • 周一至周六 每日凌晨02:00:执行增量备份,自动关联当日最新全量备份
  • 备份存放路径:/data/xtbk/,自动清理7天前过期备份

三、备份脚本

3.1 全量备份脚本 full_backup.sh

#!/bin/bash
BAK_BASE="/data/xtbk/full"
BAK_DIR="${BAK_BASE}/full_$(date +%Y%m%d)"
MY_USER="root"
MY_PASS="Master@123"
MY_DATA="/data/mysql/data"

# 创建备份目录
mkdir -p ${BAK_DIR}
# 执行全量备份
xtrabackup --user=${MY_USER} --password=${MY_PASS} \
--host=127.0.0.1 \
--datadir=${MY_DATA} \
--target-dir=${BAK_DIR} \
--backup

# 自动删除7天前全量备份
find ${BAK_BASE} -type d -name "full_*" -mtime +7 -rm -rf

3.2 增量备份脚本 inc_backup.sh

#!/bin/bash
BAK_BASE="/data/xtbk"
INC_BASE="${BAK_BASE}/inc"
# 自动获取最新全量备份作为基准(修复取值BUG)
BASE_BAK=$(ls -d ${BAK_BASE}/full/full_* |sort -r |head -1)
INC_DIR="${INC_BASE}/inc_$(date +%Y%m%d%H%M)"
MY_USER="root"
MY_PASS="Master@123"
MY_DATA="/data/mysql/data"

# 判断全量备份是否存在
if [ ! -d ${BASE_BAK} ];then
    echo "未找到基础全量备份,退出备份!"
    exit 1
fi

mkdir -p ${INC_DIR}
# 执行增量备份
xtrabackup --user=${MY_USER} --password=${MY_PASS} \
--host=127.0.0.1 \
--datadir=${MY_DATA} \
--target-dir=${INC_DIR} \
--incremental-basedir=${BASE_BAK} \
--backup

# 自动删除7天前增量备份
find ${INC_BASE} -type d -name "inc_*" -mtime +7 -rm -rf

3.3 脚本授权

chmod +x /data/script/full_backup.sh
chmod +x /data/script/inc_backup.sh

四、定时计划任务 Crontab

4.1 编辑定时任务

crontab -e

4.2 写入任务规则

# 每周日 01:00 执行全量备份
00 01 * * 0 /data/script/full_backup.sh >/dev/null 2>&1

# 周一~周六 02:00 执行增量备份
00 02 * * 1-6 /data/script/inc_backup.sh >/dev/null 2>&1

4.3 查看计划任务

crontab -l

五、数据恢复模块

5.1 恢复规则

  • 全量备份:直接prepare预处理后即可恢复
  • 增量合并:基础全量+中间增量添加 --apply-log-only;最后一份增量无需该参数,完成事务一致性

5.2 全量备份完整恢复

# 1.停止MySQL容器,备份损坏旧数据
docker stop mysql
mv /data/mysql/data /data/mysql/data_bak_err
mkdir -p /data/mysql/data

# 2.备份预处理
xtrabackup --prepare /data/xtbk/full/full_20260613

# 3.覆盖恢复数据
xtrabackup --copy-back \
--target-dir=/data/xtbk/full/full_20260613 \
--datadir=/data/mysql/data

# 4.Docker权限修复,启动容器
chown -R 999:999 /data/mysql/data
docker start mysql

5.3 增量备份合并恢复

# 1.初始化全量备份(保留事务,用于合并增量)
xtrabackup --prepare --apply-log-only --target-dir=/data/xtbk/full/full_20260613

# 2.依次合并所有增量备份(多个增量重复执行)
xtrabackup --prepare --apply-log-only \
--target-dir=/data/xtbk/full/full_20260613 \
--incremental-dir=/data/xtbk/inc/inc_202606131030

# 3.最后一份增量(收尾,结束事务)
xtrabackup --prepare \
--target-dir=/data/xtbk/full/full_20260613 \
--incremental-dir=/data/xtbk/inc/inc_202606131100

增量合并完成后,直接套用 5.2全量恢复命令即可。


标题:Xtrabackup 基础备份与恢复
作者:zhongts
地址:http://zhongts.cc:8080/articles/2026/06/13/1781317044125.html