一. 增量备份概述
xtrabackup 和 innobackupex 二个工具都支持增量备份, 这意味着能复制自上次备份以来更改的数据. 可以在每个完整备份之间执行许多增量备份, 因此, 您可以设置一个备份过程, 例如每周一次完整备份和每天一次增量备份, 或者每天一次完整备份和每小时一次增量备份. 对于定期自动备份可以在备份目录里生成带有时间戳的目录.
增量备份之所以有效, 是因为每个 InnoDB 页面都包含一个日志序列号(LSN). 每个页面的 LSN 显示了最近的变化. 增量备份复制每个页面, 对比增量备份或完整备份的 LSN, 查找要复制的页面集. 有二个算法来查找 LSN. 第一个算法是: 直接通过读取所有数据页来检查 LSN 页面. Percona 服务器提供的第二个算法是: 在服务器上启用已更改的页面跟踪功能, 当页面被更改时, 该功能会注意到这些页面.
这些信息将被写入一个紧凑的单独的位图文件. xtrabackup 二进制文件将仅使用该文件读取增量备份所需的数据页, 从而可能节省许多读取请求. 如果 xtrabackup 二进制文件找到位图文件, 则默认启用后一种算法. 即使位图数据可用, 也可以使用 xtrabackup --incremental-force-scan 强制扫描来读取所有页面.
增量备份实际上不会将数据文件与前一个备份的数据文件进行比较. 实际上, 您可以使用 xtrabackup--incremental-lsn 来执行增量备份, 甚至不需要以前的备份, 如果你知道它的 LSN. 增量备份只需读取页面并将其 LSN 与上一个备份的 LSN 进行比较. 但是, 您仍然需要一个完整的备份来恢复增量更改; 如果没有作为基础的完整备份, 增量备份是无用的.
二. 增量备份案例
要进行增量备份, 请像往常一样从完全备份开始, xtrabackup 二进制文件写入一个名为 xtrabackup_checkpoints 进入备份的目标目录, 这个文件包含一行内容 to_lsn, 是备份结束时数据库的 LSN.
步骤 1: 创建完整数据库备份, 这里不在演示(上一篇有讲到). 完全备份结束后, 如果您查看 xtrabackup_checkpoints 文件, 会看到 LSN number 相关的版本号. 以及备份类型为 full -backuped.
最后我把 / data/backups 的完整备份目录改成了 / data/backups/base.
步骤 2: 现在已经有了完整的备份, 可以基于它进行增量备份. 首先创建 / data/backups/inc1 目录.
- [root@hsr backups]# mkdir inc1
- [root@hsr backups]# chmod 777 inc1
- [root@hsr backups]# ls
- base inc1
-- 下面新增一条数据
INSERT INTO test.`testbackup` VALUES(11,'小王')
步骤 3: 增量备份
- [root@hsr backups]# xtrabackup --host=127.0.0.1 --user bkpuser --password=123456 --backup --target-dir=/data/backups/inc1
- --incremental-basedir=/data/backups/base
增量备份完成后, 查看增量备份的 xtrabackup_checkpoints 文件, 这里的 from_lsn 是备份的起始 LSN, 对于增量备份, 它必须与完整备份或上一次增量备份的 to_lsn(如果它是最后一个检查点)相同, 这里的完全备份 to_lsn 与增量备份 from_lsn 相同都是 125146873 序号. 这里备份类型为 incremental. 如下图所示:
步骤 4 : 增量备份(2)
现在可以使用 inc1 这个目录作为另一个增量备份的基础了, 下面先插入一条数据, 开始第二次增量备份. 首先创建 / data/backups/inc2 目录
- [root@hsr backups]# mkdir inc2
- [root@hsr backups]# chmod 777 inc2
- [root@hsr backups]# ls -l
总用量 0
drwxr-xr-x 6 root root 235 10 月 10 12:53 base
drwxrwxrwx 6 root root 261 10 月 10 13:05 inc1
drwxrwxrwx 2 root root 6 10 月 10 13:15 inc2
-- 下面新增一条数据
- INSERT INTO test.`testbackup` VALUES(12,'小李')
- [root@hsr backups]# xtrabackup --host=127.0.0.1 --user bkpuser --password=123456 --backup --target-dir=/data/backups/inc2
- --incremental-basedir=/data/backups/inc1
第二次增量备份成功后, 下面是查看第二次增量备份的 xtrabackup_checkpoints 文件, 起始的 LSN 的 from_lsn 序号与第一次增量备份的 to_lsn 相同.
注意: to_lsn(最后一个检查点 LSN)和 last_lsn(最后一个复制的 LSN)之间存在差异较大时, 这意味着在备份过程中服务器上有一些流量.
三. prepare 增量备份
prepare 参数, 一般情况下, 在备份完成后, 数据尚且不能用于恢复操作, 因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务. 因此, 此时数据 文件仍处于不一致状态.-apply-log-only 的作用是通过回滚未提交的事务以及同步已经提交的事务, 使数据文件处于一致性状态.
警告: 如果没有使用 xtrabackup --apply-log-only 选项, 防止回滚阶段, 那么增量备份将是无用的.
上面创建了完全备份后, 可以使用 prepare 增量备份, 然后对完全备份应用增量差异. 上面的备份目录如下:
- /data/backups/base
- /data/backups/inc1
- /data/backups/inc2
步骤 1:prepare 到完全备份, 需要运行 xtrabackup --prepare 防止回滚阶段.
[root@hsr backups]# xtrabackup --host=127.0.0.1 --user bkpuser --password=123456 --prepare --apply-log-only --target-dir=/data/backups/base
步骤 2:prepare 第一个增量备份应用于完整备份
- [root@hsr backups]# xtrabackup --host=127.0.0.1 --user bkpuser --password=123456 --prepare --apply-log-only --target-dir=/data/backups/base
- --incremental-dir=/data/backups/inc1
步骤 3: 准备第二个增量备份的过程与上面类似: 将增量备份应用于 (修改后的) 基础备份, 然后将其数据及时向前滚动到第二个增量备份点:
- [root@hsr backups]# xtrabackup --host=127.0.0.1 --user bkpuser --password=123456 --prepare --target-dir=/data/backups/base
- --incremental-dir=/data/backups/inc2
注意: xtrabackup --apply-log-only 合并除最后一个以外的所有增量备份, 上面的 prepare 运用并没有使用 --apply-log-only 选项. 即使在最后一步中使用了 --apply-log-only 选项. 备份仍然是一致的, 但在这种情况下, 服务器将执行回滚阶段.
一旦准备好的增量备份与完全备份相同, 它们可以以相同的方式恢复. 上面将增量备份文件都应用到了 / data/backup /base 文件中, 如下图所示 完全备份的 xtrabackup_checkpoints 文件此时类型是 log-applied, 它的 lsn 与第二次增量备份的 lsn 相同了.
四. 恢复还原
-- 先停掉服务
[root@hsr data]# service MySQL stop
-- 删除 data 目录下所有数据文件, 安全起见可以先保存原有副本
[root@hsr data]# rm -rf /usr/local/MySQL/data/*
-- 恢复
[root@hsr backups]# xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --user bkpuser --password=123456 --copy-back --target-dir=/data/backups/base
-- 恢复之后, 更改 data 目录权限为 MySQL
- [root@hsr data]# pwd
- /usr/local/MySQL/data
- [root@hsr data]# chown -R MySQL:MySQL ../data
-- 启动服务成功
- [root@hsr data]# service MySQL start
- Starting MySQL.. SUCCESS!
最后查看 test.`testbackup` 表, 二次增量备份的数据出来了.
总结: 学习 xtrabackup 差不多有 5 篇了, 根据官网的文档来学习还有压缩备份, 加密备份, 部分备份等, 还有一些高级功能: 节流备份, 无锁二进制日志信息, 加密的 InnoDB 表空间备份. 要完全掌握这个备份工具, 还有很多知识点. 这次学习算入门, 以后在慢慢了解, 并不断完善整合到文章中.
来源: https://www.cnblogs.com/MrHSR/p/9766964.html