XtraBackup
全备
说明
- 步骤5. FTWRL加的只读S锁,原因,方式读取数据时发生DDL操作,并获取binlog位置,redo日志暂时也会卡在这里
- 步骤8. 执行FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS语句将innodb层的redolog持久化到磁盘后进行复制(因为xtrabackup并不备份二进制日志,如果这个过程出现问题,就导致恢复之后丢失redolog中的数据,做主从复制可能会同步出错),然后停止读redolog复制线程,innobackupex备份数据的时间点是停止redolog复制时的数据对应的时间点
全量备份流程总结
- 复制已有的redo log,然后监听redo log变化并持续复制
- 复制事务引擎数据文件
- 等到数据文件复制完成
- 加锁:全局读锁
- 备份非事务引擎数据文件及其他文件
- 获取binlog点位信息等元数据
- 停止复制redo log
- 解锁:全局读锁
- 复制buffer pool dump
- 备份完成
FAQ
- 为什么要先复制redo log,而不是直接开始复制数据文件?
因为XtraBackup是基于InnoDB的crash recovery机制进行工作的。如上图2中的页2,由于是热备操作,在备份过程中可能有持续的数据写入,直接复制出来的数据文件可能有缺失或被修改的页,而redo log记录了InnoDB引擎的所有事务日志,可以在还原时应用redo log来补全数据文件中缺失或修改的页。所以为了确保redo log一定包含备份过程中涉及的数据页,需要首先开始复制redo log。
- 加全局读锁的作用?
因为要保证”非事务资源 自身的一致性“ 和 ”非事务资源与 事务资源的一致性“。在加锁期间,没有新数据写入,XtraBackup会复制此时的binlog位置信息,frm表结构,MyISAM等非事务表。
- 为什么要先停止复制redo log,再解锁全局读锁?
也是因为要保证“非事务资源与事务资源的一致性”,保证通过redo log回放后的InnoDB数据与非InnoDB数据都是处于读锁期间取得的位点。
全备恢复
全备还原流程
- 模拟MySQL进行recover,将redo log回放到数据文件中
- 等到recover完成
- 重建redo log,为启动数据库做准备
- 将数据文件复制回MySQL数据目录
- 还原完成
FAQ
在recover完成后,InnoDB数据与非InnoDB数据是达成一致的吗?
InnoDB数据会被恢复至备份结束时(全局读锁时)的状态,而非InnoDB数据本身即是在全局读锁时被复制出来,它们的数据一致
增量备份
大部分流程跟全部相同,只有在步骤2 有所区别
步骤2. 读取配置文件,找到相应的数据和日志文件的位置,读取上一次备份的to_lsn
号作为增备的起始位置
FAQ
- 开始做一个增量备份, 那么 如何识别InnoDB的哪些数据是增量的?
数据文件中的数据页都有LSN号, LSN可以看做是数据页的变更时间戳。 通过这个时间戳, 就可以识别 数据页 在 全量备份后 是否修改过, 即通过LSN可以识别数据是否是增量的。
- 如果一个数据页原本不是增量范围内的, 在增量备份的过程中, 数据页更新了, 那么增量备份是否会涵盖这个数据页?
本质, 与全量备份中的数据页新旧不一致的问题 相同, 解决方案也相同: 通过恢复时回放redo log, 解决数据新旧不一致的问题.
也就是说: 增量备份过程中, 如果数据页被更新了, 那数据文件中的这个数据页** 有可能 被拷贝到备份中, 也可能 没有被拷贝到备份中, 但这个更新信息一定会被redo log记录**, 并被记录在备份中. 在恢复过程中, redo log会被"安全地"回放成功, 达成数据的新旧一致.
增备恢复
增量备份流程总结
- 先还原一个全量备份 到 临时目录
- 开始还原增量备份, 将增量备份中的增量的数据文件, 覆盖到临时目录中
- 将增量备份中的redo log, 回放到临时目录中
- 将其他文件覆盖到临时目录中
- 增备还原完成
- 重建redo log, 为启动数据库做准备
- 将临时目录中的文件, 拷贝到MySQL的数据目录中
FAQ
非事务类的信息, 能否产生增量备份?
非事务类的信息 没有提供识别增量的机制, 只能采用全局读锁+全部拷贝+全部回放的机制进行备份
参考链接
[原理解析] XtraBackup全量备份还原
[原理解析] XtraBackup增量备份还原
[原理解析] XtraBackup 备份恢复时为什么要加apply-log-only参数?
