mysql binlog协议_mysql binlog协议分析--具体event

这篇博客详细介绍了MySQL的binlog协议,包括ANONYMOUS_GTID_LOG_EVENT, QUERY_EVENT, TABLE_MAP_EVENT和WRITE_ROWS_EVENT等事件类型,并对比了MySQL与MariaDB在binlog事件上的差异。文章还探讨了GTID_EVENT如何替代BEGIN Query Event,并提供了binlog事件头的格式和事务的开始与结束标志。" 104129888,5753575,MyBatis基础配置与使用详解,"['mybatis', 'jdbc', '持久层', '数据库连接池', '动态SQL']
摘要由CSDN通过智能技术生成

这几天在修改canal, 连接mysql和maria接收到的event有所区别

拿一个简单的insert sql来举例

mysql 会有以下几个event写入到binlog里

1.ANONYMOUS_GTID_LOG_EVENT

2.QUERY_EVENT

header {

version: 1

logfileName: "20170105-162017-bin.000001"

logfileOffset: 1920

serverId: 1

serverenCode: "UTF-8"

executeTime: 1508809530000

sourceType: MYSQL

schemaName: ""

tableName: ""

eventLength: 72

}

entryType: TRANSACTIONBEGIN

storeValue: " \354\001"

3.TABLE_MAP_EVENT

4.WRITE_ROWS_EVENT

header {

version: 1

logfileName: "20170105-162017-bin.000001"

logfileOffset: 2040

serverId: 1

serverenCode: "UTF-8"

executeTime: 1508809530000

sourceType: MYSQL

schemaName: "test"

tableName: "test1"

eventLength: 40

eventType: INSERT

}

entryType: ROWDATA

storeValue: "\b\333\001\020\001P\000b\035\022\033\b\000\020\004\032\002id \000(\0010\000B\00215R\aint(11)"

5.XID_EVENT

header {

version: 1

logfileName: "20170105-162017-bin.000001"

logfileOffset: 2080

serverId: 1

serverenCode: "UTF-8"

executeTime: 1508809530000

sourceType: MYSQL

schemaName: ""

tableName: ""

eventLength: 31

}

entryType: TRANSACTIONEND

storeValue: "\022\003184"

如果一个事务里不仅一条sql, 4.WRITE_ROWS_EVENT就会有N条, 我们可以注意到一个完整事务TRANSACTIONBEGIN和TRANSACTIONEND必然会配对出现

mysql event部分格式说明

https://dev.mysql.com/doc/internals/en/event-data-for-specific-event-types.html

mariadb 的事件和mysql不一样

1.GTID_EVENT

2.TABLE_MAP_EVENT

3.WRITE_ROWS_EVENT

header {

version: 1

logfileName: "20170105-162017-bin.000001"

logfileOffset: 2040

serverId: 1

serverenCode: "UTF-8"

executeTime: 1508809530000

sourceType: MYSQL

schemaName: "test"

tableName: "test1"

eventLength: 40

eventType: INSERT

}

entryType: ROWDATA

storeValue: "\b\333\001\020\001P\000b\035\022\033\b\000\020\004\032\002id \000(\0010\000B\00215R\aint(11)"

4.XID_EVENT

header {

version: 1

logfileName: "20170105-162017-bin.000001"

logfileOffset: 2080

serverId: 1

serverenCode: "UTF-8"

executeTime: 1508809530000

sourceType: MYSQL

schemaName: ""

tableName: ""

eventLength: 31

}

entryType: TRANSACTIONEND

storeValue: "\022\003184"

gtid_event就是用来替代begin query event的

Binlog event的header格式如下:

4 timestamp

1 event type

4 server-id

4 event-size

4 log pos

2 flags

header的长度固定为19,event type用来标识这个event的类型,event size则是该event包括header的整体长度,而log pos则是下一个event所在的位置

binlog基础格式介绍可参考

http://www.jianshu.com/p/5e6b33d8945f

canal源码里并没有对gtid_event进行解析处理,查看mariadb官网

Event Header

Type[1] = 0xa2

Flags[2] = 08 00 => LOG_EVENT_SUPPRESS_USE_F

Fields

uint<8> GTID sequence

uint<4> Replication Domain ID

if flag & FL_GROUP_COMMIT_ID

uint<8> commit_id

else

具体地址参考 https://mariadb.com/kb/en/library/gtid_event/

下面是截取到2个事务gtid_event的字节码

41, 0, 0, 34, 0, -17, 0, -71, 75, 51, 90, -94, 2, 0, 0, 0, 38, 0, 0, 0, 56, 20, 0, 0, 8, 0, 115, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 3, 8, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 56, 13, 0, 8, 0, 18, 0, 4, 4, 4, 4, 18, 0, 0, -35, 0, 4, 26, 8, 0, 0, 0, 8, 8, 8, 2, 0, 0, 0, 10, 10, 10,

41, 0, 0, 38, 0, -17, 0, -30, 75, 51, 90, -94, 2, 0, 0, 0, 38, 0, 0, 0, -28, 20,0, 0, 8, 0, 116, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 3, 8, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 56, 13, 0, 8, 0, 18, 0, 4, 4, 4, 4, 18, 0, 0, -35, 0, 4, 26, 8, 0, 0, 0, 8, 8, 8, 2, 0, 0, 0, 10, 10, 10,

红色部分是message header, 41, 0, 0是message长度, 是message sequence_id, -17, 0是semi标识位, -71或者-30开始就是具体event的内容了 115, 25, 0, 0, 0, 0, 0, 0 就是gtid了,用小序列标识=6516

Protocol::Packet

Data between client and server is exchanged in packets of max 16MByte size.

Payload Type Name Description

int<> payload_length Length of the payload. The number of bytes in the packet beyond the initial 4 bytes that make up the packet header.

int<> sequence_id Sequence ID

string payload payload of the packet

Example:

01 00 00 00 01

length: 1

sequence_id: x00

payload: 0x01

mysql 协议分析

MYSQL Binlog协议分析 此处不讨论建立连接,验证和handshake的交互协议 Binlog协议 一个MYSQL 通信包由包头包体组成 包体根据具体的交互协议有自身的组成结构, 在binlo ...

Mysql Binlog 三种格式介绍及分析

一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

Mysql Binlog三种格式介绍及分析【转】

一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

Mysql Binlog日志详解

一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

Mysql binlog二进制日志

Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的实际原sql语句都会被记录在binlog中. 优点:不需要记录每一 ...

使用python 模仿mybinlog 命令 二进制分析mysql binlog

出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该声明. ...

MySQL协议分析

MySQL协议分析 标签: mysql 2015-02-27 10:22 1807人阅读 评论(1) 收藏 举报  分类: 数据库(19)    目录(?)[+]   1 交互过程 MySQL客户端与 ...

MySQL协议分析2

MySQL协议分析 议程 协议头 协议类型 网络协议相关函数 NET缓冲 VIO缓冲 MySQL API 协议头 ● 数据变成在网络里传输的数据,需要额外的在头部添加4 个字节的包头. . packe ...

mixer&colon; mysql协议分析

综述 要实现一个mysql proxy,首先需要做的就是理解并实现mysql通讯协议.这样才能通过proxy架起client到server之间的桥梁. mixer的mysql协议实现主要参考mysql ...

随机推荐

Crontab中shell每分钟执行一次HDFS文件上传不执行的解决方案

一.Crontab -e 加入输出Log */1 * * * * /qiwen_list/upload_to_hdfs.sh > /qiwen_list/mapred.log 2>&amp ...

跨平台的 SQL 客户端

The major update to SQL client was to move to the .NET Core networking libraries instead of the nati ...

js 的post提交的写法

function AddEditDevice(data){ var form = $("#deviceEditform"); if (form.length == 0) { for ...

未能读取并闩锁页 &lpar;1&colon;xxxxx&rpar;(用闩锁类型 SH)

设置数据库为紧急模式 停掉SQL Server服务: 把应用数据库的数据文件XXX_Data.mdf移走: 重新建立一个同名的数据库XXX: 停掉SQL服务: 把原来的数据文件再覆盖回来: 运行以下语 ...

Django(二十)model中的 class Meta

https://www.cnblogs.com/tongchengbin/p/7670927.html class Main(models.Model): img = models.CharField ...

java 并发包runnable 与 callable

1.runnable 与 callable区别 2.避免callable执行完任务,获取返回结果时,阻塞其他子线程 下面固定线程池,设置4个,表明同时只有4个线程在执行任务,当某个线程执行完一个任务, ...

Ubuntu 速配指南&colon;开启3D桌面特效

http://www.lupaworld.com/article-205494-1.html 安装compizconfig-settings-manager(以下简称ccsm) 在终端里输入:sud ...

python核心编程笔记——Chapter5

好吧,开始第五章习题: 5-2.又是老调重谈,raw_input这个函数真是非常麻烦,返回是str类型,没办法,只能在函数里面使用int内建.(就只是一道简单的两数相乘,哭了) #!/usr/bin/ ...

四、redis系列之主从复制与哨兵机制

1. 绪言 在现实应用环境中,出于数据容量.容灾.性能等因素的考虑,往往不会只使用一台服务器,而是使用集群的方式.Redis 中也有类似的维持一主多从的方式提高 Redis 集群的高可用性的方案,而其 ...

树形结构 DropDownList

前台 后台代码: 先绑定第一级 string ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值