欢迎来到 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/internals/en/binary-log.html

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/66u5K7a9u8GcE2KPn4kCaA

技术分享 | 万里数据库MGR Bug修复之路

https://mp.weixin.qq.com/s/IavpeP93haOKVBt7eO8luQ

Macos系统编译percona及部分函数在Macos系统上运算差异

https://mp.weixin.qq.com/s/jAbwicbRc1nQ0f2cIa_2nQ

技术分享 | 利用systemd管理MySQL单机多实例

https://mp.weixin.qq.com/s/iJjXwd0z1a6isUJtuAAHtQ

产品 | GreatSQL,打造更好的MGR生态

https://mp.weixin.qq.com/s/ByAjPOwHIwEPFtwC5jA28Q

产品 | GreatSQL MGR优化参考

https://mp.weixin.qq.com/s/5mL_ERRIjpdOuONian8_Ow

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee:

https://gitee.com/GreatSQL/GreatSQL

GitHub:

https://github.com/GreatSQL/GreatSQL

微信&QQ群:

可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群

QQ群:533341697

微信小助手:wanlidbc

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

技术分享 | 浅谈MySQL闪回的实现的更多相关文章

  1. 技术分享 | 浅谈mysql语法解析调试方法

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 本文向您介绍一种利用mysql解析器和bison的调试选项进行sql语法解析跟踪 ...

  2. (4.11)mysql备份还原——mysql闪回技术(基于binlog)

    0.闪回技术与工具简介 mysql闪回工具比较流行三大类: [0.1]官方的mysqlbinlog:支持数据库在线/离线,用脚本处理binlog的输出,转化成对应SQL再执行.通用性不好,对正则.se ...

  3. MySQL闪回原理与实战

    本文将介绍闪回原理,给出笔者的实战经验,并对现存的闪回工具作比较. DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除 ...

  4. 浅谈mysql主从复制的高可用解决方案

    1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...

  5. mysql 闪回原理

    利用MySQL闪回技术恢复误删除误更改的数据 笔者相信很多人都遇到过忘带where条件或者where条件漏写了一个和写错了的情况,结果执行了delete/update后把整张表的数据都给改了.传统的解 ...

  6. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  7. MySQL 闪回工具之 binlog2sql

    生产上误删数据.误改数据的现象也是时常发生的现象,作为 DBA 这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太 ...

  8. 浅谈mysql innodb缓存策略

    浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...

  9. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

随机推荐

  1. JavaScript数组操作常用方法

    @ 目录 数组基础遍历方法. for for of for in 数组的基础操作方法. push:尾部追加元素 pop:尾部移出元素 unshift:头部追加元素 shift:头部移出元素 splic ...

  2. Java中如何快捷的创建不可变集合

    在Java 9中又新增了一些API来帮助便捷的创建不可变集合,以减少代码复杂度. 本期配套视频:Java 9 新特性:快速定义不可变集合 常规写法 以往我们创建一些不可变集合的时候,通常是这样写的: ...

  3. Tmux终端复用神器使用心得

    tmux在连接远程服务器做实验时很有帮助,可以为每一个项目设置一个Session,在Session中设置不同的Window同时跑多个实验,Window本身还可以分割为多个Pane,在一个视野内利用多个 ...

  4. CabloyJS全栈开发之旅(1):NodeJS后端编译打包全攻略

    背景 毋庸置疑,NodeJS全栈开发包括NodeJS在前端的应用,也包括NodeJS在后端的应用.CabloyJS前端采用Vue+Framework7,采用Webpack进行打包.CabloyJS后端 ...

  5. 2021.03.13【NOIP提高A&B组】模拟 总结

    T1 题目大意:从原点开始循环执行命令,问最后的位置 好吧这就是一道幼儿园的周期问题,模拟即可 #include<bits/stdc++.h> using namespace std; c ...

  6. 第6章 字符串(下)——C++字符串

    6.5 C++ strings(C++字符串) C风格字符串常见错误:试图去访问数组范围以外的元素:没有使用函数strcpy( )来实现字符串之间的复制:没有使用函数strcmp( )来比较两个字符串 ...

  7. 喜提JDK的BUG一枚!多线程的情况下请谨慎使用这个类的stream遍历。

    你好呀,我是歪歪. 前段时间在 RocketMQ 的 ISSUE 里面冲浪的时候,看到一个 pr,虽说是在 RocketMQ 的地盘上发现的,但是这个玩意吧,其实和 RocketMQ 没有任何关系. ...

  8. 在Visual Studio 2019中使用scanf报错C4996解决办法

    错误警告信息 错误C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To ...

  9. 『现学现忘』Docker基础 — 39、实战:自定义Tomcat9镜像

    目录 1.目标 2.准备 3.编写Dockerfile文件 4.构建镜像 5.启动镜像 6.验证容器是否能够访问 7.向容器中部署WEB项目,同时验证数据卷挂载 (1)准备一个简单的WEB项目 (2) ...

  10. UiPath键盘操作的介绍和使用

    一.键盘操作的介绍 模拟用户使用键盘操作的一种行为: 例如使用发送热键(Sendhotkey),输入信息 (Typeinto)的操作 二.键盘操作在UiPath中的使用 1.打开设计器,在设计库中新建 ...