当前位置: 首页 > 科技观察

两行代码修复MySQL8.xbinlog错位问题!!

时间:2023-03-13 15:44:22 科技观察

作者个人研发在高并发场景下提供了一个简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,经受住了生产环境的考验。为了造福更多童鞋,这里提供一个开源框架地址:https://github.com/sunshinelyz/mykit-delay写在前面MySQL是互联网行业使用最多的关系型数据库之一,MySQL是开源,深入研究MySQL可以加深我们对数据库原理的理解。由于mykit-data是开源的,很多朋友试用后反映mykit-data无法正确解析MySQL8的binlog。于是测试了一下,mykit-data在解析MySQL5.x的binlog时没有问题,能够正确解析结果数据。但是在解析MySQL8.x的binlog时,binlog的日志位数总是相差12位,解析失败。文章已收录于:https://github.com/sunshinelyz/technology-binghehttps://gitee.com/binghe001/technology-binghe问题修复今天太晚了,还在研究MySQL的源码8.0.20,问题修复过程之后,我会写一篇详细的文章分享给朋友们。这里直接说一下我是怎么解决这个问题的。MySQL5.xbinlog的解析结果和MySQL8.xbinlog的解析结果一直存在差异。框架原代码直接解析MySQL5.x没有问题。解析MySQL8.x时出现位数不一致的问题。这段时间几乎把MySQL的官方文档都看了一遍,重写了mykit-data中解析binlog日志的功能。解析MySQL5.x没问题,解析MySQL8.x还是错位。什么地方出了错?就在我一头雾水解决问题的时候,突然想到了一个想法:解决MySQL8.x的binlog不就老是错位了吗?然后我读了多余位数的binlog数据,直接忽略了,这不就可以对齐后面的binlog解析操作了吗?赶快试用吧,所以我在mykit-data框架的源码中添加了如下代码。上述代码是对解析校验和读取MySQLbinlog位的封装。当读取的binlog位数没有达到读取限制位数时,读取binlog数据,直到读取的binlog位数达到读取的限制位数。具体内部逻辑,小伙伴们可以阅读mykit-data的源码。添加此逻辑后进行测试验证,MySQL8.x数据库的binlog分析成功!!困扰我好几天的问题,无意间解决了!!从解决这个问题的结果来看,MySQL8.x的binlog本质上比MySQL5.x的binlog位数要长,目的是对齐binlog的解析位,以便下一个事件能够正确解析。而且这个处理不会影响分析结果。这种情况经常发生。当你为解决某个问题苦苦思索,长时间找不到解决办法时,你会在不经意的一瞬间无意中解决这个难题,但前提是你需要深入理解它。原理和尝试各种途径和方法来解决它!关于mykit-datamykit-data是一个完全开源的数据异构中间件,支持插件化、可视化的数据异构框架,支持MySQL到MySQL、MySQL到Oracle、Oracle到MySQL的全量、实时/定时增量数据同步,从甲骨文到甲骨文。完整的插件化和可视化操作。使用日志最大限度地减少同步期间的数据丢失。支持失败重试,人工干预,支持查看同步数据和详细日志信息。目前支持MySQL5.x、MySQL8.x、Oracle11g及以上版本。未来将以插件的形式支持更多的异构数据源。例如,未来会增加SQLServer、PostgreSQL、Redis、ES、Hadoop、HBase、MongoDB、TiDB等数据源。mykit-data的开源地址如下:GitHub:https://github.com/sunshinelyz/mykit-dataGitee:https://gitee.com/binghe001/mykit-data扫描下方二维码即可。转载本文请联系冰川科技公众号。