使用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执行两个基本操作:

  1. 应用已提交的事务(重做日志)。
  2. 回滚未提交的事务。

我们使用--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服务器使用。

  1. 停止MySQL服务。
  2. 确保MySQL数据目录为空或已备份(可选:如果允许,使用--move-back选项,但--copy-back对于恢复更安全)。
  3. 使用xtrabackup --copy-back移动文件。
  4. 修复权限。
  5. 重启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。