解析MySQL8.x binlog错位了,差点裂开了!!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL是互联网行业使用的最多的关系型数据库之一,而且MySQL又是开源的,对于MySQL的深入研究,能够加深我们对于数据库原理的理解。自从开源了mykit-data之后,不少小伙伴试用后,反馈mykit-data无法正确的解析MySQL8的binlog。于是我测试了下,mykit-data在解析MySQL5.x的binlog时,没有啥问题,能够正确的解析出结果数据。然而,在解析MySQL8.x的binlog时,总是与binlog日志位数相差12位而导致解析失败。

问题修复

今天太晚了,我还在研究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框架的源码中,添加了如下代码。

微信图片_20211121154134.jpg

上面代码是对解析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的全量、实时/定时增量数据同步。完全的插件化、可视化操作。通过日志最大限度的避免同步过程中的数据丢失。支持失败重试,人工干预,支持查看同步的数据和详细的日志信息,目前已有30多家公司将mykit-data应用于生产环境,支撑着其核心业务数据的实时与定时同步,并经受住了高并发、大流量的考验。

mykit-data框架目前支持MySQL5.x、MySQL8.x,Oracle 11g及以上版本。后续会以插件的形式支持更多的异构数据源。

mykit-data的开源地址如下:

GitHub:https://github.com/sunshinelyz/mykit-data

Gitee:https://gitee.com/binghe001/mykit-data

最后,小伙伴们为这款开源项目点个Star呀!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
22天前
|
存储 SQL 关系型数据库
MySQL中binlog、redolog与undolog的不同之处解析
每个都扮演回答回溯与错误修正机构角色: BinLog像历史记载员详细记载每件大大小小事件; RedoLog则像紧急救援队伍遇见突發情況追踪最后活动轨迹尽力补救; UndoLog就类似时间机器可倒带历史让一切归位原始样貌同时兼具平行宇宙观察能让多人同时看见各自期望看见历程而互不干扰.
111 9
|
2月前
|
存储 SQL 关系型数据库
MySQL的Redo Log与Binlog机制对照分析
通过合理的配置和细致的管理,这两种日志机制相互配合,能够有效地提升MySQL数据库的可靠性和稳定性。
97 10
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与性能优化全解析
我整理的这份内容涵盖了 MySQL 诸多核心知识。包括查询语句的书写与执行顺序,多表查询的连接方式及内、外连接的区别。还讲了 CHAR 和 VARCHAR 的差异,索引的类型、底层结构、聚簇与非聚簇之分,以及回表查询、覆盖索引、左前缀原则和索引失效情形,还有建索引的取舍。对比了 MyISAM 和 InnoDB 存储引擎的不同,提及性能优化的多方面方法,以及超大分页处理、慢查询定位与分析等,最后提到了锁和分库分表可参考相关资料。
|
4月前
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
189 23
|
3月前
|
关系型数据库 MySQL
MySQL字符串拼接方法全解析
本文介绍了四种常用的字符串处理函数及其用法。方法一:CONCAT,用于基础拼接,参数含NULL时返回NULL;方法二:CONCAT_WS,带分隔符拼接,自动忽略NULL值;方法三:GROUP_CONCAT,适用于分组拼接,支持去重、排序和自定义分隔符;方法四:算术运算符拼接,仅适用于数值类型,字符串会尝试转为数值处理。通过示例展示了各函数的特点与应用场景。
|
5月前
|
SQL 运维 关系型数据库
MySQL Binlog 日志查看方法及查看内容解析
本文介绍了 MySQL 的 Binlog(二进制日志)功能及其使用方法。Binlog 记录了数据库的所有数据变更操作,如 INSERT、UPDATE 和 DELETE,对数据恢复、主从复制和审计至关重要。文章详细说明了如何开启 Binlog 功能、查看当前日志文件及内容,并解析了常见的事件类型,包括 Format_desc、Query、Table_map、Write_rows、Update_rows 和 Delete_rows 等,帮助用户掌握数据库变化历史,提升维护和排障能力。
|
9月前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
198 6
|
7月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
581 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
6月前
|
存储 SQL 关系型数据库
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
123 16

推荐镜像

更多