使用Percona XtraBackup配置增量MySQL备份
构建和恢复Percona XtraBackup增量MySQL备份,包括全量备份、LSN链、准备步骤和复制回数据库。
使用Percona XtraBackup配置增量MySQL备份
Percona XtraBackup (PXB) 可以对使用InnoDB数据的MySQL兼容服务器进行热备份。全量备份很简单,但大型数据库通常需要增量MySQL备份,这样就不必每晚复制相同的页面。
本指南涵盖了全量基础备份、链式增量备份以及按顺序应用每个增量的恢复序列的命令。
理解Percona XtraBackup的增量机制
PXB依赖于InnoDB存储引擎的内部工作原理,特别是使用日志序列号(LSN)跟踪更改。每个InnoDB页面都标记有一个LSN。当PXB执行增量备份时,它只记录那些LSN大于上次备份时记录的LSN的页面。
关键的是,增量备份需要一个全量基础备份来建立起点。所有后续的增量备份都是链式的,引用紧邻的前一个备份(可以是基础备份或其他增量备份)。
关键文件和概念
- LSN(日志序列号): 用于确定更改开始和结束位置的标记。
- xtrabackup_checkpoints:每次备份时创建的文件,包含
to_lsn(备份结束时达到的LSN),对于增量备份,还包含from_lsn(起始LSN)。 --incremental-basedir:增量运行期间使用的基本标志,指向前一个备份的目录(确定起始LSN)。
步骤1:执行全量基础备份
在拍摄任何增量快照之前,必须创建一个完整、一致的基础备份。这为整个备份链奠定了基础。
首先为全量备份定义一个清晰的目录:
# 定义全量备份的基础目录
BASE_DIR="/data/backups/2023-10-01_FULL"
# 创建目录
mkdir -p $BASE_DIR
# 执行全量备份
xtrabackup --backup \
--target-dir=$BASE_DIR \
--user=root --password=secret_password \
--datadir=/var/lib/mysql
# 验证全量备份的LSN
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'
注意: 启动备份过程时,
target-dir必须为空或不存在。所需的权限因MySQL和XtraBackup版本而异,因此请使用Percona当前的权限指南创建专用备份用户,而不是重复使用root。
步骤2:执行第一次增量备份
要执行第一次增量备份,我们必须使用--incremental-basedir标志引用全量基础备份目录。PXB将从基础备份中读取to_lsn,并仅复制自该点以来发生更改的页面。
# 定义第一次增量备份的目录
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"
# 执行增量备份,引用全量基础备份
xtrabackup --backup \
--target-dir=$INCREMENTAL_1_DIR \
--incremental-basedir=/data/backups/2023-10-01_FULL \
--user=root --password=secret_password
步骤3:链接后续增量备份
对于任何后续的增量备份(INC2、INC3等),--incremental-basedir必须指向紧邻的前一个增量备份目录。
如果我们想基于INC1以来的更改创建INC2:
# 定义第二次增量备份的目录
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"
# 执行增量备份,引用前一个增量备份(INC1)
xtrabackup --backup \
--target-dir=$INCREMENTAL_2_DIR \
--incremental-basedir=/data/backups/2023-10-02_INC1 \
--user=root --password=secret_password
只要您保持序列,这种链接就会持续。如果链中的任何一环断裂(即目录丢失),恢复过程将失败。
恢复:应用增量更改
恢复增量备份集是一个多步骤过程,涉及按顺序将更改应用到基础备份。与全量备份不同,增量备份不能直接复制到数据目录。
恢复阶段1:准备基础备份
首先,必须准备基础备份。这通常在临时暂存区域进行,以确保数据安全。
在准备基础备份时,PXB执行两个基本操作:
- 应用已提交的事务(重做日志)。
- 回滚未提交的事务。
我们使用--prepare标志,但关键的是,我们添加了--apply-log-only标志。这可以防止PXB回滚未提交的事务,因为后续的增量日志需要这些事务片段来完成恢复。
# 定义暂存目录
RESTORE_TARGET="/data/restore_staging"
# 将全量基础备份文件复制到暂存区域
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET
# 准备基础备份,保持其准备好接收增量
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only
# 查找确认信息:'completed OK!'
恢复阶段2:按顺序应用增量备份
接下来,按照拍摄的确切时间顺序应用每个增量备份。每个命令必须引用暂存目录(当前正在修改的基础备份),并使用--incremental-dir标志指向特定的增量快照。
# 应用增量1
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
--incremental-dir=/data/backups/2023-10-02_INC1 \
--apply-log-only
# 应用增量2
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
--incremental-dir=/data/backups/2023-10-03_INC2 \
--apply-log-only
# ... 继续所有需要的增量 ...
恢复阶段3:完成准备
一旦应用了最后一个所需的增量快照,运行不带--apply-log-only标志的最终准备步骤。这允许PXB执行最终清理,回滚整个备份序列中仍处于未提交状态的事务,从而产生一致的状态。
# 完成准备(不带--apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET
# 重要:查找最终确认信息,表明'xtrabackup: Recovery completed OK!'
恢复阶段4:将数据复制回MySQL
成功准备后,暂存目录($RESTORE_TARGET)中的数据是一致的,可以供MySQL服务器使用。
- 停止MySQL服务。
- 确保MySQL数据目录为空或已备份(可选:如果允许,使用
--move-back选项,但--copy-back对于恢复更安全)。 - 使用
xtrabackup --copy-back移动文件。 - 修复权限。
- 重启MySQL。
# 停止MySQL服务
sudo systemctl stop mysql
# 将准备好的文件复制回MySQL数据目录
xtrabackup --copy-back --target-dir=$RESTORE_TARGET
# 确保文件的正确所有权
sudo chown -R mysql:mysql /var/lib/mysql
# 启动MySQL
sudo systemctl start mysql
增量备份管理的最佳实践
自动化和脚本化
增量备份策略在完全自动化时最为有效。脚本应自动管理LSN链,动态识别最新的备份目录以用于--incremental-basedir标志。
保留策略
增量链可能会变得非常长,使恢复变得缓慢且脆弱。通过定期执行新的全量备份来轮换链。一些团队还根据祖父-父亲-儿子保留模型保留每周和每月的全量备份。
压缩和限速
对于非常繁忙的服务器,考虑在备份阶段使用--throttle选项来限制I/O操作。使用--compress来减小备份大小,这对于增量备份生成的较小数据集非常有益。
# 带压缩和限速的示例
xtrabackup --backup \
--target-dir=$INCREMENTAL_3_DIR \
--incremental-basedir=$INCREMENTAL_2_DIR \
--compress \
--throttle=100
验证和监控
定期测试您的恢复程序。无法恢复的备份是无用的。监控增量链消耗的磁盘空间,尤其是在启动新的全量基础备份之前。
要点
增量XtraBackup仅在链完整时有效:全量备份、基于全量备份的第一次增量备份,然后每个后续增量备份基于前一个备份。在恢复期间,使用--apply-log-only准备基础备份,按顺序应用每个增量备份,运行一次不带--apply-log-only的最终准备,然后才将准备好的数据复制回MySQL。