技术分享 | 浅谈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/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闪回的实现的更多相关文章
- 技术分享 | 浅谈mysql语法解析调试方法
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 本文向您介绍一种利用mysql解析器和bison的调试选项进行sql语法解析跟踪 ...
- (4.11)mysql备份还原——mysql闪回技术(基于binlog)
0.闪回技术与工具简介 mysql闪回工具比较流行三大类: [0.1]官方的mysqlbinlog:支持数据库在线/离线,用脚本处理binlog的输出,转化成对应SQL再执行.通用性不好,对正则.se ...
- MySQL闪回原理与实战
本文将介绍闪回原理,给出笔者的实战经验,并对现存的闪回工具作比较. DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除 ...
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- mysql 闪回原理
利用MySQL闪回技术恢复误删除误更改的数据 笔者相信很多人都遇到过忘带where条件或者where条件漏写了一个和写错了的情况,结果执行了delete/update后把整张表的数据都给改了.传统的解 ...
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- MySQL 闪回工具之 binlog2sql
生产上误删数据.误改数据的现象也是时常发生的现象,作为 DBA 这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太 ...
- 浅谈mysql innodb缓存策略
浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
随机推荐
- GO GMP协程调度实现原理 5w字长文史上最全
1 Runtime简介 Go语言是互联网时代的C,因为其语法简洁易学,对高并发拥有语言级别的亲和性.而且不同于虚拟机的方案.Go通过在编译时嵌入平台相关的系统指令可直接编译为对应平台的机器码,同时嵌入 ...
- Groovy基础语法
Groovy 基础语法 变量定义 1.支持动态类型,使用def关键字定义变量 // Java中定义变量的方式 int age = 18; String name = "张三"; / ...
- Linux系列之linux访问windows文件
Linux永久挂载windows共享文件 Linux系统必须安装samba-client Linux服务器必须能访问到Windows的共享文件服务的(445端口) 1.Windows共享文件 2.测试 ...
- Elasticsearch学习系列二(基础操作)
本文将分为3块讲解Es的基础操作.分别为:索引(index).映射(mapping).文档(document). 索引操作 创建索引库 语法: PUT /索引名称{ "settings&qu ...
- 图片放在div中低下会出现一条缝
页面要达到的样子 中间写的是时候是向div里面放一张图片就行了 <head> <link rel="stylesheet" href="reset.cs ...
- Java中将对象或者集合对象转换成json字符串
1.对象和字符串相互转换 2.集合对象和字符串相互转换
- HDFS数据平衡
一.datanode之间的数据平衡 1.1.介绍 Hadoop 分布式文件系统(Hadoop Distributed FilSystem),简称 HDFS,被设计成适合运行在通用硬件上的分布式文件 ...
- [.NET6]使用ML.NET+ONNX预训练模型整活B站经典《华强买瓜》
最近在看微软开源的机器学习框架ML.NET使用别人的预训练模型(开放神经网络交换格式.onnx)来识别图像,然后逛github发现一个好玩的repo.决定整活一期博客. 首先还是稍微科普一下机器学习相 ...
- 【微服务专题之】.Net6下集成消息队列上-RabbitMQ
微信公众号:趣编程ACE关注可了解更多的.NET日常实战开发技巧,如需源码 请公众号后台留言 源码;[如果觉得本公众号对您有帮助,欢迎关注] .Net中RabbitMQ的使用 [微服务专题之].N ...
- 30m精度土壤类型、土壤质地、土壤有机质、土壤PH、土壤氮磷钾
数据下载链接:数据下载链接 引言 全国土壤类型.质地.养分及变化等信息产品分为土壤类型数据.土壤质地数据.土壤养分数据及土壤变化数据等.该类产品是基于野外调查和实地采样,结合历史数据,建立全国土壤类 ...