专栏首页解Bug之路MySql-Binlog协议详解-报文篇

MySql-Binlog协议详解-报文篇

#MySql-Binlog协议详解-报文篇 紧接上篇流程篇,本篇主要将binlog的event报文。 ##Event报文分层 event报文主要分三层。 (1)MySql报文都有的length-body防粘包结构。 (2)Event Header (2)Event Body 总体结构如下图所示:

##EventHeader Event Header结构如下图所示:

(1)前4比特,是当前binlogEvent发生的时间戳 (2)1byte的event类型,详情见github (3)4byte的serverId,是发送event的主库标识 (4)4byte的event_length,是指包含当前eventHeader的整个body的长度 (5)最后2byte是标志位 解EventHeader报文的代码如下所示:

    public void read() {
        timestamp = mm.readUB4() * 1000;
        eventType = getEventType(mm.read());
        serverId = mm.readUB4();
        eventLength = mm.readUB4();
        nextPosition = mm.readUB4();
        flags = mm.readUB2();
    }

EventBody

紧接着就是描述EventBody。EventBody根据类型分主要有: (1)RotateEventData:当MySql的binlog文件从file1滚动到file2的时候会发生此事件。 (2)UpdateRowsEventData:当binlog格式设置的是Row|mixed且Row更新的时候会发生此事件。 (3)QueryEventData:当binlog格式设置的是statement|mixed且做DB有了更新、插入或删除操作的时候会发生时间(例如修改Row,alter表等)。 (4)WriteRowsEventData:当binlog格式设置的是Row|mixed且有insert操作时候,有此事件发生。 (5)余下还有不少event格式,在此就不一一罗列了,具体见github

RotateEventData

(1)8byte的binlogPosition (2)以0x00结尾的String,表示了当前binlog文件名 ###UpdateRowsEventData

(1)byte的tableId,表明唯一一张表 (2)一个复杂的Bit集合,有更新的Row在更新之前的值在下面Row列表中的位置 (3)一个复杂的Bit集合,有更新的Row在更新之后的值在下面Row列表中的位置 (4)一个Row的列表,配合上面两个bitSet使用 具体解析BitSet非常复杂,详情见github ###QueryEventData

(1)4bytes的线程id (2)4bytes的当前事件执行时间 (3)1bytes的数据库名字长度 (4)2bytes的errorCode (5)2bytes的statusVar长度 (6)statusVar (7)以0x00结尾的数据库名称 (8)以0x00皆为的执行SQL,例如update t_temp set name='123' where id=1 ###WriteRowsEventData

(1)8bytes的tableId (2)一个复杂的Bit集合,和下面的Row配合使用 (3)一个Row的列表,表明了插入的行 由于上述几个eventData解析都很复杂,详情请见github

github地址

https://github.com/alchemystar/Aroundight

原文链接

https://my.oschina.net/alchemystar/blog/850467

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • TCP协议详解-定时器

            如代码所示,如果tcp的state<ESTABLISHED,表明其处于连接建立状态。定时器超时后,调用dropit终止连接。大多数伯克利系统将建...

    无毁的湖光-Al
  • MySql协议详解-CRUD与Result篇

    一般对DB的CRUD操作都由com_query报文封装并发送给DB。com_query报文如下图所示:

    无毁的湖光-Al
  • MySql协议详解-HandShake握手篇

    各位有没有对Cobar、MyCat这些MySqlProxy感到新奇。反正笔者在遇到这些proxy时,感受到其对代码的无侵入兴感到大为惊奇。于是走上了研究MySq...

    无毁的湖光-Al
  • 蓝桥杯-2019第十届蓝桥杯B组C++年号字串

    小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27 以上的数字,小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对 应28,A...

    Debug客栈
  • 20M 文件用 Java 压缩从30秒到1秒的优化过程

    有一个需求需要将前端传过来的10张照片,然后后端进行处理以后压缩成一个压缩包通过网络流传输出去。之前没有接触过用Java压缩文件的,所以就直接上网找了一个例子改...

    黄泽杰
  • 【MySQL】删库别着急跑路(二)--mysqldump的使用

    上篇文章我们一起学习了Xtrabackup的备份原理和使用方法,今天一起聊下mysqldump的使用。mysqldump是MySQL数据库自带的一个备份命令,它...

    MySQL数据库技术栈
  • CIFAR10数据集实战-ResNet网络构建(中)

    用户6719124
  • 获取 zabbix 挂件数据(widget)

    Zabbix 有非常丰富的 API ,但没有 widget 的 API。 所以获取 widget 的数据需要通过模拟登录爬取网页的形式来做。虽然我们可以用一定的...

    用户1416054
  • iOS runtime(基础篇)

    大壮
  • 我爸的电脑中了勒索病毒……

    上个月的一天,接到老爸消息:“家里电脑出了点问题,QQ打不开,还有好多文档也都打不开。”

    良月柒

扫码关注云+社区

领取腾讯云代金券