乐趣区

关于mysql:技术分享-浅谈MySQL闪回的实现

欢送来到 GreatSQL 社区分享的 MySQL 技术文章,如有疑难或想学习的内容,能够在下方评论区留言,看到后会进行解答

1、闪回实现原理

2、binlog 文件格式初探

3、闪回实现过程

1、闪回实现原理

闪回的业务价值是,在 DBA 执行谬误的数据提交操作之后,还能把数据恢复还原到之前某个时刻的状态,最大水平地挽回损失。

在 MySQL 中,binlog 文件次要用于主从同步二进制数据日志。当主服务器数据产生变更时,会把变动明细长久化到 binlog 文件中,此时从服务器通过拉取并解析 binlog 文件,实现数据的同步。正是因为 binlog 文件中记录了数据变更的信息,因而 MySQL 的闪回是基于 binlog 文件来实现的。

说的更精确一点,如果要在 MySQL 中实现闪回,则必须要求 binlog 文件日志格局是 binlog_format=row,并且 binlog_row_image=full。通过指定 binlog 文件的日志格局,就能在 binlog 中残缺记录数据变动的轨迹和具体的操作行为(增删改)的前后差别。

基于上述前提,咱们能够解析并解决 binlog 文件中的事件,而后反序遍历。同时对增删改进行反转逆操作,即插入映射成删除、删除映射成插入、更新替换新旧数据区间。最初输入对应数据回滚的 binlog 文件,将其再次导入 mysql,即实现对增删改数据的回滚还原。

2、binlog 文件格式初探

binlog 是一个二进制文件,具体寄存的门路,能够通过在 mysql 的客户端执行:show variables like ‘%datadir%’,这个 SQL 语句来查看。这时联合下面的门路信息,在终端中能够输出:

#  binlog 文件寄存门路
cd /home/mysql-server/bld_debug/install_debug/data/
   
#  binlog.000006 指要查看的 binlog 文件名
    hexdump -C binlog.000006|more。

后果示例如下:

    00000000  fe 62 69 6e ad 10 15 61  0f 01 00 00 00 79 00 00  |.bin...a.....y..|
    00000010  00 7d 00 00 00 00 00 04  00 38 2e 30 2e 32 35 2d  |.}.......8.0.25-|
    00000020  31 35 2d 64 65 62 75 67  00 00 00 00 00 00 00 00  |15-debug........|
    00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000040  00 00 00 00 00 00 00 00  00 00 00 ad 10 15 61 13  |..............a.|
    00000050  00 0d 00 08 00 00 00 00  04 00 04 00 00 00 61 00  |..............a.|
    00000060  04 1a 08 00 00 00 08 08  08 02 00 00 00 0a 0a 0a  |................|
    00000070  2a 2a 00 12 34 00 0a 28  01 ea d7 cf 01 ad 10 15  |**..4..(........|
    00000080  61 23 01 00 00 00 1f 00  00 00 9c 00 00 00 80 00  |a#..............|
    ......

后面的 4 个字节 fe 62 69 6e 是魔数,标识文件类型是 binlog。前面的二进制数据则示意事件,binlog 中记录的事件类型次要有:

  • FORMAT_DESCRIPTION_EVENT:该事件形容了 binlog 文件的版本信息和 MySQL 服务器版本信息,以及文件中波及到所有事件的类型。它是 binlog 文件中的第一个事件,并且有且只有一个。
  • TABLE_MAP_EVENT:该事件记录了将要产生更新的表构造信息,比方表字段的类型,表字段长度以及是否可空等。
  • WRITE_ROWS_EVENT/UPDATE_ROWS_EVENT/DELETE_ROWS_EVENT:别离示意插入、更新和删除事件,必须配合 TABLE_MAP_EVENT 来进行解析,通常咱们将上述三个事件统称为 ROWS_EVENT 事件。
  • binlog 文件的内容就是由头 4 个字节的魔数标识叠加若干事件因素组成的。更多 binlog 文件的信息能够参考官网文档:https://dev.mysql.com/doc/int…

3、闪回实现过程

  • 步骤 1:解析 binlog 文件中的事件。特地将 ROWS_EVENT、TABLE_MAP_EVENT 提取进去,放入待处理队列。
  • 步骤 2:循环遍历队列元素,将 ROWS_EVENT 和它就近的 TABLE_MAP_EVENT 进行关联绑定,同时反转 DML 操作。即判断事件类型如果是插入事件 WRITE_ROWS_EVENT 用删除事件 DELETE_ROWS_EVENT 进行替换;判断如果是删除事件 DELETE_ROWS_EVENT 用插入事件 WRITE_ROWS_EVENT 替换;如果是更新事件 UPDATE_ROWS_EVENT 则替换对调更新操作前后的新旧数据镜像分区。
  • 步骤 3:逆序遍历队列元素,同时生成新的回滚 binlog 日志文件。
  • 步骤 4:把回滚的 binlog 文件通过 mysql 客户端导入到数据库中。

Enjoy GreatSQL :)

文章举荐:

技术分享 | MGR 最佳实际 (MGR Best Practice)
https://mp.weixin.qq.com/s/66…

技术分享 | 万里数据库 MGR Bug 修复之路
https://mp.weixin.qq.com/s/Ia…

Macos 零碎编译 percona 及局部函数在 Macos 零碎上运算差别
https://mp.weixin.qq.com/s/jA…

技术分享 | 利用 systemd 治理 MySQL 单机多实例
https://mp.weixin.qq.com/s/iJ…

产品 | GreatSQL,打造更好的 MGR 生态
https://mp.weixin.qq.com/s/By…

产品 | GreatSQL MGR 优化参考
https://mp.weixin.qq.com/s/5m…

对于 GreatSQL

GreatSQL 是由万里数据库保护的 MySQL 分支,专一于晋升 MGR 可靠性及性能,反对 InnoDB 并行查问个性,是实用于金融级利用的 MySQL 分支版本。

Gitee:
https://gitee.com/GreatSQL/Gr…

GitHub:
https://github.com/GreatSQL/G…

微信 &QQ 群:

可搜寻增加 GreatSQL 社区助手微信好友,发送验证信息“加群”退出 GreatSQL/MGR 交换微信群

QQ 群:533341697
微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 公布!

退出移动版