问题描述
使用 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