文档章节

MySql-Binlog协议详解-报文篇

无毁的湖光-Al
 无毁的湖光-Al
发布于 2017/03/03 15:15
字数 597
阅读 1.7K
收藏 3

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

rotate_event
(1)8byte的binlogPosition (2)以0x00结尾的String,表示了当前binlog文件名 ###UpdateRowsEventData
update-rows
(1)byte的tableId,表明唯一一张表
(2)一个复杂的Bit集合,有更新的Row在更新之前的值在下面Row列表中的位置
(3)一个复杂的Bit集合,有更新的Row在更新之后的值在下面Row列表中的位置
(4)一个Row的列表,配合上面两个bitSet使用
具体解析BitSet非常复杂,详情见github
###QueryEventData query-event
(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 write-rows
(1)8bytes的tableId
(2)一个复杂的Bit集合,和下面的Row配合使用
(3)一个Row的列表,表明了插入的行
由于上述几个eventData解析都很复杂,详情请见github

github地址

https://github.com/alchemystar/Aroundight

原文链接

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

© 著作权归作者所有

无毁的湖光-Al

无毁的湖光-Al

粉丝 494
博文 34
码字总数 63458
作品 0
浦东
后端工程师
私信 提问
加载中

评论(2)

无毁的湖光-Al
无毁的湖光-Al 博主

引用来自“HaiqiangYe”的评论

很详细的解析!

@HaiqiangYe 多谢:)
HaiqiangYe
HaiqiangYe
很详细的解析!
mysql 正确清理binlog日志

mysq 正确清理binlog日志 前言: MySQL中的binlog日志记录了数据库中数据的变动,便于对数据的基于时间点和基于位置的恢复,但是binlog也会日渐增大,占用很大的磁盘空间,因此,要对binlog使...

linjin200
2019/06/05
72
0
MySQL · 源码分析 · MySQL BINLOG半同步复制数据安全性分析

半同步复制(semisynchronous replication)MySQL使用广泛的数据复制方案,相比于MySQL内置的异步复制它保证了数据的安 全,本文从主机在Server层提交事务开始一直到主机确认收到备机回复进行...

阿里云RDS-数据库内核组
2017/03/08
0
0
mysql数据恢复,binlog详解

个人博客:mysql数据恢复,binlog详解 binlog日志恢复数据,是挽救错误操作和数据损坏一根救命稻草,所以认识和使用binglog对于技术人员还是很有必要的 binlog一般用于 主从复制 中 master节点...

NiceCui
2019/07/25
0
0
《Linux高性能服务器编程》学习笔记(二)--ip协议详解

学习更多,请点击:《Linux高性能服务器编程》学习笔记:目录索引 IP头部结构详解 图解 IP框架整理 图解 注:需要该.xmind文件,可自行下载IP协议框架图.xmind

WangYe8613
03/31
0
0
Linux高级网络开发奇妙之旅

一、基础理论篇 01、网络协议入门 02、LAN、WAN、WLAN、VLAN 和 VPN 的区别 03、IP 地址介绍 04、广播地址介绍 05、无连接和面向连接协议的区别 06、因特网的IP协议是不可靠无连接的,那为何...

tennysonsky
2015/04/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

植物:君子兰

ylbtech-植物:君子兰 君子兰(学名: Clivia miniata),别名 剑叶石蒜、大叶石蒜,是 石蒜科 君子兰属的 多年生草本植物,属观赏 花卉,原产于 南非南部。 花期长达30-50天,以冬春为主,元...

osc_gp8avabl
30分钟前
40
0
植物:玉簪

ylbtech-植物:玉簪 玉簪(学名: Hosta plantaginea (Lam.) Aschers.),又名 白萼、白鹤仙,是 百合科,玉簪属的 多年生宿根植物。叶基生,成簇,卵状心形、卵形或卵圆形。 花葶高40-80...

osc_1psr53ow
31分钟前
50
0
植物:迎春花

ylbtech-植物:迎春花 迎春花(学名: Jasminum nudiflorum Lindl. ):别名 迎春、黄素馨、金腰带,落叶 灌木丛生。株高30-500厘米。小枝细长直立或拱形下垂,呈纷披状。3小叶复叶交互对生,...

osc_fscujk71
32分钟前
50
0
植物:雪铁芋

ylbtech-植物:雪铁芋 雪铁芋(学名: Zamioculcas zamiifolia Engl.),又名为 金钱树。是多年生常绿 草本植物,是极为少见的带地下 块茎的观叶植物。地上部无主茎,不定芽从块茎萌发形成大...

osc_47qtuhkb
33分钟前
31
0
Java之关键字的使用

java中有很多的关键字,他们的使用让Java语言变得更加灵活、易用,下面将介绍Java中最常用的几个关键字并说明其用法。 关键字:return 1.使用范围: 使用在方法体中 2.作用: ① 结束方法 ②...

RealBruce
34分钟前
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部