Xtrabackup8配置MySQL8增量备份🥝
Xtrabackup8配置MySQL8增量备份🥝
⭐全量备份文档请移步:https://www.cnblogs.com/haoee/p/19414795
一、XtraBackup 8 增量备份的核心原理
1️⃣ 增量备份“增”的是什么?
👉 基于 LSN(Log Sequence Number)
-
全量备份:记录一个起始 LSN
-
增量备份:只备份 LSN 之后发生变化的 InnoDB 页
物理备份的本质是对比 LSN(Log Sequence Number,日志序列号)。
-
每个备份目录里都有一个文件叫
xtrabackup_checkpoints。 -
当你指定
--incremental-basedir时,XtraBackup 会打开那个目录里的xtrabackup_checkpoints,查看里面的to_lsn。 -
本次备份就从这个
to_lsn开始,拷贝之后所有变化的数据页。
LSN 信息存放在:xtrabackup_checkpoints文件。
[root@localhost ~]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 323404380 #备份开始的 LSN(日志序列号);全量备份总是从 0 开始
to_lsn = 3640151788 #备份结束时记录的最后一个 LSN
last_lsn = 3640151788 #最后应用的 LSN,应该与 to_lsn相等,如果不相等,说明备份可能有问题
flushed_lsn = 3640151788 #已刷新到磁盘的 LSN
redo_memory = 0 #重做日志内存使用量(字节)
redo_frames = 0 #重做日志帧数
2️⃣增量备份的关键点是:
-
必须基于上一次的 全量备份 或 增量备份。
-
使用
--incremental-basedir参数。 -
同样支持压缩、多线程、日志记录和旧备份清理。
- 恢复时:先
解压→ 再prepare→ 顺序不能错
3️⃣XtraBackup 的技术依据(为何必须这样做)
-
基于 LSN 的增量: XtraBackup 用
xtrabackup_checkpoints中的to_lsn/from_lsn标记范围。新的增量应当从“上一份备份的to_lsn”继续,否则链会断。 -
备份类型标识: 在
xtrabackup_checkpoints里有backup_type=Full|Incremental,这能验证目录是不是有效的备份集。 -
恢复顺序依赖: 恢复时需要先 prepare 全量,再按时间顺序依次应用每一份增量。如果基准选择错误,恢复阶段会失败或数据不一致。
二、增量备份命令
执行增量备份,变量在下面脚本中已定义。
[root@localhost ~]# xtrabackup --defaults-file=/etc/xtrabackup.cnf \
--backup \
--target-dir="${INC_BACKUP_DIR}" \
--incremental-basedir="${LATEST_BASE}" \
--parallel="${PARALLEL_THREADS}" \
--compress \
--compress-threads="${COMPRESS_THREADS}" \
--no-server-version-check \
>> "${LOG_FILE}" 2>&1
命令各参数详解:
| 参数 | 含义与作用 | 增量备份中的特殊意义 |
|---|---|---|
--defaults-file=/etc/xtrabackup.cnf |
指定包含数据库连接信息的配置文件路径(安全、规范)。 | 与全量备份相同。 |
--backup |
执行备份操作的主指令。 | 与全量备份相同,但结合 --incremental-basedir 后,其行为变为增量备份。 |
--target-dir=“${INC_BACKUP_DIR}” |
指定本次增量备份文件的存储目录。 | 需要是一个新的、空的目录,用于存放增量数据。 |
--incremental-basedir=“${LATEST_BASE}” |
【核心参数】 指定基准全量备份的目录路径。XtraBackup会读取该目录下的 xtrabackup_checkpoints 文件,获取其结束时的LSN(日志序列号),然后只备份LSN大于该值的新数据页。 |
这是增量备份的灵魂。LATEST_BASE 变量通常指向全量备份脚本创建的 latest_full 软链接(如/data/backup/physical_backup/latest_full),确保每次都基于最新的全备进行增量。 |
--parallel=“${PARALLEL_THREADS}” |
设置并行拷贝线程数。 | 与全量备份相同。 |
--compress --compress-threads=“…” |
启用并行压缩。 | 与全量备份相同。 |
--no-server-version-check |
跳过版本检查。 | 与全量备份相同。 |
>> “${LOG_FILE}” 2>&1 |
重定向所有输出到日志文件。 | 与全量备份相同。 |
三、 增量备份脚本
增量备份优先基于增量备份,其次选择全量备份目录。
[root@localhost ~]# vim xtrabackup_increment_backup.sh
#!/bin/bash
#
# ==============================================================================
# MySQL 增量物理备份脚本(基于 Percona XtraBackup 8)
# 适用于 MySQL 8.0 + 主从环境,优先在从库执行
# 作者:noleaf提供,生产可用
# 日期:2025-12-29
#===============================================================================
#设置xtrabackup和MySQL路径,脚本运行时会自动把 MySQL 和 XtraBackup 的路径加入 PATH
export PATH=/usr/local/mysql-8.0.44/bin:/usr/local/percona-xtrabackup-8.0.35/bin:/usr/bin:/bin
#更安全的错误处理
set -euo pipefail
#=============================变量定义==========================================
#定义时间戳
Timestamp=$(date '+%F_%H-%M-%S')
#备份根目录
BACKUP_BASE=/data/mysql/backup
#增量备份根目录
BACKUP_ROOT=${BACKUP_BASE}/physical_incremental_backup
#备份文件名称
BACKUP_NAME="inc_backup_${Timestamp}"
#增量备份目录
INC_BACKUP_DIR=${BACKUP_ROOT}/${BACKUP_NAME}
#日志目录及文件
LOG_DIR=${BACKUP_ROOT}/logs
LOG_FILE=${LOG_DIR}/${BACKUP_NAME}.log
#控制并行复制数据的线程数(自动计算20%CPU线程数,最小4)
PARALLEL_THREADS=$(($(nproc)*20/100))
[[ $PARALLEL_THREADS -lt 4 ]] && PARALLEL_THREADS=4
#控制并行压缩数据的线程数(自动计算10%CPU线程数,最小2)
COMPRESS_THREADS=$(($(nproc)*10/100))
[[ $COMPRESS_THREADS -lt 2 ]] && COMPRESS_THREADS=2
#定义清理文件时间
KEEP_DAYS=15
echo "==========================创建备份必要的目录======================="
mkdir -p "$BACKUP_ROOT" "$LOG_DIR" "$INC_BACKUP_DIR" || {
echo "ERROR: 无法创建备份相关目录"
exit 1
}
echo "========================== 增量备份开始于 [$Timestamp] ===================" | tee -a "$LOG_FILE"
#1.校验 xtrabackup 是否存在
command -v xtrabackup >/dev/null 2>&1 || {
echo "ERROR: xtrabackup 未安装" | tee -a "$LOG_FILE"
exit 1
}
#2.校验 MySQL 实例是否存活
if ! mysqladmin --defaults-extra-file=/etc/xtrabackup.cnf ping --silent; then
echo "ERROR: MySQL 实例不可用,取消备份" | tee -a "$LOG_FILE"
exit 1
fi
#=============================基准备份选择逻辑==================================
#选择哪个备份目录执行(全量备份或增量备份目录)
# 校验某个目录是否是有效的备份
is_valid_backup() {
local dir="$1"
local ck="${dir}/xtrabackup_checkpoints"
# 1. 检查文件是否存在
if [[ ! -f "$ck" ]]; then
return 1
fi
# 2. 检查内容是否包含有效关键字 (忽略大小写)
# XtraBackup 8.0 的关键字通常是 full-backuped 或 incremental
if grep -qE "full-backuped|incremental" "$ck"; then
return 0
else
return 1
fi
}
# 获取最新的增量和全量目录
LATEST_INC=$(ls -td ${BACKUP_ROOT}/inc_backup* 2>/dev/null | head -1 || true)
LATEST_FULL=$(ls -td ${BACKUP_BASE}/physical_full_backup/full_backup* 2>/dev/null | head -1 || true)
# 优先选择增量,否则选择全量
if [[ -n "$LATEST_INC" ]] && is_valid_backup "$LATEST_INC"; then
LATEST_BASE="$LATEST_INC"
elif [[ -n "$LATEST_FULL" ]] && is_valid_backup "$LATEST_FULL"; then
LATEST_BASE="$LATEST_FULL"
else
echo "ERROR: 未找到有效的基准备份(缺少 checkpoints 或类型不正确)。请先执行全量备份。" | tee -a "$LOG_FILE"
exit 1
fi
echo "基于备份目录: ${LATEST_BASE}" | tee -a "$LOG_FILE"
#=============================执行增量备份======================================
#4.执行增量备份
if xtrabackup --defaults-file=/etc/xtrabackup.cnf \
--backup \
--target-dir="${INC_BACKUP_DIR}" \
--incremental-basedir="${LATEST_BASE}" \
--parallel="${PARALLEL_THREADS}" \
--compress \
--compress-threads="${COMPRESS_THREADS}" \
--no-server-version-check \
>> "${LOG_FILE}" 2>&1; then
echo "Success: 增量备份成功!" | tee -a "$LOG_FILE"
else
echo "ERROR: 增量备份失败!请检查日志 ${LOG_FILE}" | tee -a "$LOG_FILE"
exit 1
fi
echo "Incremental backup completed at $(date '+%F_%H-%M-%S')" >> ${LOG_FILE}
#=============================清理15天之前的旧备份====================================
echo "正在清理 $KEEP_DAYS 天之前的旧增量备份..." | tee -a $LOG_FILE
find "${BACKUP_ROOT}" -maxdepth 1 -type d -name "inc_backup*" -mtime +${KEEP_DAYS} -exec rm -rf {} \;
find "${LOG_DIR}" -maxdepth 1 -type f -name "inc_backup*" -mtime +${KEEP_DAYS} -exec rm -f {} \;
#================================统计数据简报===========================================
BACKUP_SIZE=$(du -sh "${INC_BACKUP_DIR}" | cut -f1)
echo "本次增量备份大小:${BACKUP_SIZE}" | tee -a "$LOG_FILE"
echo "本次增量备份目录:${INC_BACKUP_DIR}" | tee -a "$LOG_FILE"
echo "=================== 增量备份完成于 [$(date '+%F %H:%M:%S')] ===================" | tee -a "$LOG_FILE"
四、加入计划任务
[root@localhost ~]# crontab -e
# 每 4 小时一次增量,自动追溯有效基准
00 06,10,14,18,22 * * * /bin/bash /data/mysql/scripts/xtrabackup_incremental_backup.sh >> /var/log/xtrabackup_incremental_backup.log 2>&1

浙公网安备 33010602011771号