「XtraBackup」- 增量备份及恢复

问题描述

使用 XtraBackup 进行增量备份(仅仅备份自上次备份后变更的数据),并使用备份数据进行恢复。

增量备份原理:
1)每个 InnoDB Page 都包含 LSN,LSN 是整个数据库的系统版本号,每个 InnoDB Page 的 LSN 都展示 InnoDB Page 是如何变化的
2)在增量备份时,对比 InnoDB Page 的 LSN 与 全量备份的 LSN,如果 InnoDB Page 的 LSN 较新,则复制该 InnoDB Page
3)更进一步,如果你知道 LSN,则无需基础的全量备份,可以使用 –incremental-lsn 直接指定(但是恢复的时候依旧需要基础的全量备份)

注意事项:
1)该增量备份只能针对 MySQL 实例,而不能针对特定数据库或者特定数据表

第一步、创建增量备份

#1 首先,创建全量备份

增量备份是在全量备份的基础之上,因此需要先创建全量备份:

xtrabackup --backup --target-dir=/data/backups/base

查看 xtrabackup_checkpoints 文件可以获取 LSN 相关信息。

#2 然后,创建增量备份

在全量备份的基础之上,执行如下命令创建增量备份:

xtrabackup --backup --target-dir=/data/backups/inc1 \
    --incremental-basedir=/data/backups/base

在 /data/backups/inc1 中保存相关增量备份的文件以及信息。

查看 xtrabackup_checkpoints 文件可以获取 LSN 相关信息。

#3 再次创建增量备份(基于上次增量备份)

基于上一次增量备份,我们创建新的增量备份:

xtrabackup --backup --target-dir=/data/backups/inc2 \
    --incremental-basedir=/data/backups/inc1

查看 xtrabackup_checkpoints 文件可以获取 LSN 相关信息。

注意事项及补充说明

基于此,我们可以使用 xtracbackup 创建差异备份。即“永远”在 /data/backups/base 的基础上创建增量备份。

第二步、准备增量备份(重要步骤)

增量备份的准备阶段不同与全量备份的准备阶段:

对于全量备份,在准备阶段中,需要:将已提交事务从日志文件写入数据文件;回滚未提交的事务;

对于增量备份,在准备阶段中,不能回滚未提交的事务,因为事务可能在下次备份中提价;

因此对全量备份使用 xtrabackup –apply-log-only 应用日志,防止发生回滚,否则全量备份无法用于增量备份。

#1 准备全量备份

首先对全量备份应用日志,以作为增量的基础:

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base

此时的全量备份可以用于数据恢复,以为未提交的事务会在启动时被 MySQL 处理。

#2 应用首个增量备份

执行如下命令,应用首个增量备份:

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \
    --incremental-dir=/data/backups/inc1

最后新的备份数据位于 /data/backups/base 目录,即该目录数据已经被修改,不再是原先的全量备份。

注意事项,增量备份目录(/data/backups/inc1)只能使用一次,如果以后会再次使用,需要先将其备份。

#3 再次应用增量备份

在应用增量备份的全量备份的基础上,应用下个增量备份:

xtrabackup --prepare --target-dir=/data/backups/base \
    --incremental-dir=/data/backups/inc2

注意,在最后一次(一定是最后一次)应用增量备份时,不要使用 –apply-log-only 选项。即使使用该选项,备份也是一致的,但是 MySQL 将执行回滚阶段。

第三步、使用数据恢复

1)最后可将 /data/backups/base/ 内容复制到数据库目录;
2)修改数据库文件权限及所有者/组;
3)启动数据库服务,并检查数据库服务是否正常;

参考文献

Percona XtraBackup 2.4 Documentation/Incremental Backup