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 条评论
登录 后参与评论

相关文章

来自专栏抠抠空间

logging模块

函数式简单配置 import logging logging.debug('debug message') logging.info('info mes...

29012
来自专栏QQ音乐技术团队的专栏

ContentProvider简介

(一) 基础知识 Content Provider属于Android四大组件之一,相比较而言,它更侧重于共享数据。Android的数据存储方式有以下几种:...

3116
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第三十一天 WebService学习【悟空教程】

简单的网络应用使用单一语言写成,它的唯一外部程序就是它所依赖的数据库。大家想想是不是这样呢?

2224
来自专栏软件开发 -- 分享 互助 成长

linux下进程相关操作

一、定义和理解 狭义定义:进程是正在运行的程序的实例。 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。 进程的概念主要有两点: 第一...

2475
来自专栏PHP在线

PHP的错误机制总结

PHP的错误机制也是非常复杂的,做了几年php,也没有仔细总结过,现在就补上这一课。

2275
来自专栏小程序解决方案的专栏

Wafer2 Node.js QuickStart 架构分析

Wafer2 的 Node.js QuickStart 采用了 Koa.js 框架编写,Koa 将整个请求过程看做全异步的操作,使用 Node.js 7.6 开...

6.3K6
来自专栏用户2442861的专栏

tinyhttpd 剖析

http://blog.csdn.net/jcjc918/article/details/42129311

2142
来自专栏乐百川的学习频道

Python 日志输出

打印日志是很多程序的重要需求,良好的日志输出可以帮我们更方便的检测程序运行状态。Python标准库提供了logging模块,让我们也可以方便的在Python中打...

3609
来自专栏求索之路

Android数据层架构的实现 上篇

最近我们app的服务器吃不消了,所以我在为服务器增加缓存层之后,又想到在app端进行二级缓存以减少app对服务器的访问。我想很多app应该在项目的初期架构的时...

3198
来自专栏张戈的专栏

Linux运维工程师:30道面试题整理

前段时间,我在准备面试的时搜到的一套 Linux 运维工程师面试题,感觉比较全面,一直保存在草稿,刚在整理后台时翻了出来,干脆就发出来好了,以备不时之需。 1....

2K5

扫码关注云+社区

领取腾讯云代金券