两行代码修复了解析MySQL8.x binlog错位的问题!!
写在前面
MySQL是互联网行业使用的最多的关系型数据库之一,而且MySQL又是开源的,对于MySQL的深入研究,能够加深我们对于数据库原理的理解。自从开源了mykit-data之后,不少小伙伴试用后,反馈mykit-data无法正确的解析MySQL8的binlog。于是我测试了下,mykit-data在解析MySQL5.x的binlog时,没有啥问题,能够正确的解析出结果数据。然而,在解析MySQL8.x的binlog时,总是与binlog日志位数相差12位而导致解析失败。
文章已收录到:
https://github.com/sunshinelyz/technology-binghe
https://gitee.com/binghe001/technology-binghe
问题修复
今天太晚了,我还在研究MySQL 8.0.20的源码,问题的修复过程后续再写一篇详细的文章来与小伙伴们分享下。这里,我就直接说我是如何解决这个问题的。
MySQL5.x binlog的解析结果与MySQL8.x binlog的解析结果总是存在位数偏差,框架原本的代码直接解析MySQL 5.x是没啥问题的,在解析MySQL 8.x的时候出现位数错误。
期间,我几乎翻阅了MySQL的所有官方文档,把mykit-data中关于解析binlog日志的功能重新写了一遍,解析MySQL5.x没问题,解析MySQL8.x还是错位。
到底哪里出了问题呢?就在对于问题的解决一筹莫展的时候,突然,想到一个思路:解决MySQL8.x binlog的时候不是总错位吗?那我就把多余位数的binlog数据读取出来,直接忽略掉,使后续binlog的解析操作对齐不就行了吗?
赶紧尝试一下,于是我在mykit-data框架的源码中,添加了如下代码。

上面代码是对解析MySQL binlog位数的校验和读取的封装,当读取的binlog位数未达到读取的限制位数时,一直读取binlog的数据,直到读取的binlog位数达到读取的限制位数位置。具体内部的逻辑,小伙伴们可以阅读mykit-data的源码。
加上这个逻辑后,进行测试验证,解析MySQL 8.x数据库的binlog竟然成功了!!困扰我几天的问题就这么在不经意间解决了!!
从解决这个问题的结果来看,MySQL8.x的binlog在本质上比MySQL5.x的binlog位数要长,中间会拼接用来分隔不同事件位的标识,我们在解析MySQL8.x的binlog日志时,可直接忽略掉这些分隔不同事件位的标识,目的就是让binlog的解析位对齐,从而能够正确的解析出下一个事件。而这样处理,也不会影响解析结果。
很多时候就是这样,当你苦于解决某个问题,迟迟找不到解决方案而一筹莫展时,在某个不经意的瞬间,就会无意中解决这个棘手的问题,但前提是你需要深刻理解它的原理并尝试各种方式和方法来解决它!
关于mykit-data
mykit-data是一款完全开源的数据异构中间件,支持插件化、可视化的数据异构框架,支持MySQL到MySQL、MySQL到Oracle、Oracle到MySQL、Oracle到Oracle的全量、实时/定时增量数据同步。完全的插件化、可视化操作。通过日志最大限度的避免同步过程中的数据丢失。支持失败重试,人工干预,支持查看同步的数据和详细的日志信息。
目前支持MySQL5.x、MySQL8.x,Oracle 11g及以上版本。后续会以插件的形式支持更多的异构数据源。
mykit-data的开源地址如下:
GitHub:https://github.com/sunshinelyz/mykit-data
Gitee:https://gitee.com/binghe001/mykit-data
最后,小伙伴们为这款开源项目点个Star呀!!
好了,今天就到这儿吧,我是冰河,大家有啥问题可以在下方留言,也可以加我微信:sun_shine_lyz,一起交流技术,一起进阶,一起牛逼~~
两行代码修复了解析MySQL8.x binlog错位的问题!!的更多相关文章
- Android热修复原理(一)热修复框架对比和代码修复
在Android应用开发中,热修复技术被越来越多的开发者所使用,也出现了很多热修复框架,比如:AndFix.Tinker.Dexposed和Nuwa等等.如果只是会这些热修复框架的使用那意义并不大,我 ...
- iOS 两行代码解决数据持久化
在实际的iOS开发中,有些时候涉及到将程序的状态保存下来,以便下一次恢复,或者是记录用户的一些喜好和用户的登录信息等等. 这就需要涉及到数据的持久化了,所谓数据持久化就是数据的本地保存,将数据从内存中 ...
- 【转】Delphi+Halcon实战一:两行代码识别QR二维码
Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...
- gRaphael——JavaScript 矢量图表库:两行代码实现精美图表
gRaphael 是一个致力于帮助开发人员在网页中绘制各种精美图表的 Javascript 库,基于强大的 Raphael 矢量图形库.你只需要编写几行简单的代码就能创建出精美的条形图.饼图.点图和曲 ...
- javascript两行代码按指定格式输出日期时间
javascript两行代码按指定格式输出日期时间,具体看代码: function date2str(x,y) { var z ={y:x.getFullYear(),M:x.getMonth()+1 ...
- GridView中使用如下button OnClientClick代码会出现解析错误
在GridView中使用如下代码会出现解析错误: <asp:LinkButton ID="DeleteButton" runat="server" Cau ...
- bootloader启动代码init.s解析----IRQ中断处理函数
bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ...
- 漂浮广告代码兼容ie、firefox,多个漂浮不冲突,调用只需两行代码
原文:漂浮广告代码兼容ie.firefox,多个漂浮不冲突,调用只需两行代码 将广告内容放在div中,设置一个id,然后用下面方法调用var adcls=new AdMove("div的id ...
- 震惊!Vector两行代码求逆序对,六行代码过普通平衡树
Vector两行代码求逆序对 背景:济南集训Day7上午T2,出了一道逆序对的裸题,SB的我没看出是逆序对来,于是现场推了一个很刁钻的求逆序对的方法 首先我们想一下冒泡排序的过程,我们不难发现,对于每 ...
随机推荐
- Python 学习笔记 之 01 - 基础总结
数据类型 整数 十六进制和八进制使用0开头,0x12f, 010 浮点数 可以用科学记数法,如1.23x10^9 可以写成 12.3e8 ,0.000012可以写成 1.2e-5 空值 用None表示 ...
- react第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)
第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性) #课程目标 理解路由的原理及应运 理解react-router-dom以及内置的一些组件 合理应用内置组 ...
- python 利用cvxopt线性规划
from cvxopt import matrix, solvers ################################################################# ...
- C#中搜索xsd文件中的某个数据源
步骤 1.打开***.xsd文件. 2.数据源之间的空白处,右键->属性. 3.在VS右侧会跳出一个属性窗口. 4.有个名称为DataSet的下拉框,所有的数据源名称都在其中,单击即可定位到所选 ...
- 持续提升程序员幸福指数——使用abp vnext设计一款面向微服务的单体架构
可能你会面临这样一种情况,在架构设计之前,你对业务不甚了解,需求给到的也模棱两可,这个时候你既无法明确到底是要使用单体架构还是使用微服务架构,如果使用单体,后续业务扩展可能带来大量修改,如果使用微服务 ...
- 有了它(powermock)再也不担心单元测试不达标了
为什么要写单元测试 优点:单元测试可以减少bug率,提升代码的质量.还可以通过单元测试来熟悉业务. 公司硬性要求:有些公司可能还会强制要求,每次新增代码.或者变更代码单测覆盖率要达到多少比例才能申请代 ...
- Spring AOP 实战运用
Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...
- windows使用sdelete安全的删除文件
SDelete是一款来自于微软Sysinternals[1]的应用.使用SDelete可以安全的删除现有文件,以及安全地擦除磁盘的未分配部分中存在的数据(包括已经删除或加密的文件).SDelete使用 ...
- 用Margin还是用Padding的区别
用margin还是用padding这个问题是每个学习CSS进阶时的必经之路. CSS边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时 ...
- 浅谈Java并发编程系列(八)—— LockSupport原理剖析
LockSupport 用法简介 LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现. LockSupport是用来创建锁和其他同步 ...