mysql longblob binlog 解析_解析MYSQL BINLOG 二进制格式(4)--TABLE_MAP_EVENT

本文详细解析了MYSQL BINLOG中的TABLE_MAP_EVENT,介绍了该事件在row模式bin log中的重要性,包括表ID、数据库名、表名、字段数量和类型等关键信息的二进制格式解读。
摘要由CSDN通过智能技术生成

展开阅读全文

原创:转载请说明出处谢谢!

上接

http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作

http://blog.itpub.net/7728585/viewspace-2133189/ 解析MYSQL BINLOG 二进制格式(2)--FORMAT_DESCRIPTION_EVENT

http://blog.itpub.net/7728585/viewspace-2133321/ 解析MYSQL BINLOG 二进制格式(3)--QUERY_EVENT

class:Table_map_log_event

event:TABLE_MAP_EVENT

event_code:19

本event只用于 row模式的bin log ,从5.1.5开始,其实这部分

包含了大量的关于表的原数据,也是在保证slave正确

复制数据的重要event

--fixed data

6 bytes 表ID

2 bytes 保留

--variable data part

1 bytes  数据库名长度

var-size 数据库名字 0x00 结尾

1 bytes  表名长度

var-size 表名 0x00 结尾

packed interger 字段数量 注意这里就是packed interger参考第一篇文章

var-size 字段类型,每一个字节代表一个字段,如下:

typedef enum enum_field_types {

MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,

MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,

MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,

MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP,

MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,

MYSQL_TYPE_DATE, MYSQL_TYPE_TIME,

MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,

MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,

MYSQL_TYPE_BIT,

MYSQL_TYPE_TIMESTAMP2,

MYSQL_TYPE_DATETIME2,

MYSQL_TYPE_TIME2,

MYSQL_TYPE_JSON=245,

MYSQL_TYPE_NEWDECIMAL=246,

MYSQL_TYPE_ENUM=247,

MYSQL_TYPE_SET=248,

MYSQL_TYPE_TINY_BLOB=249,

MYSQL_TYPE_MEDIUM_BLOB=250,

MYSQL_TYPE_LONG_BLOB=251,

MYSQL_TYPE_BLOB=252,

MYSQL_TYPE_VAR_STRING=253,

MYSQL_TYPE_STRING=254,

MYSQL_TYPE_GEOMETRY=255

} enum_field_types;

packed interger:metadata block 长度,注意这里就是packed interger参考第一篇文章

var-size metadata block数据

var-size 每一位代表这个字段的值是否为NULL,其长度为 INT((n+7)/8) n代表字段数量

接下来具体解析一个

--

00000200  bf ba 78 97 58 13 e5 6b  01 00 33 00 00 00 34 02  |..x.X..k..3...4.|

00000210  00 00 00 00 ae 00 00 00  00 00 01 00 04 74 65 73  |.............tes|

00000220  74 00 05 6d 79 62 69 6e  00 02 03 0f 02 3c 00 03  |t..mybin.....<..>

00000230  a1 23 ad 72

这次关于event header 部分就不解析了

ba 78 97 58 13 e5 6b 01 00 33 00 00 00 34 02

00 00 00 00

也就是这部分,直接进入event data部分

--fixed data part

ae 00 00 00  00 00 :表ID 174

01 00:保留

--variable data part

04:数据库名长度 4字节

74 65 73 74 00:数据库名test 0x00结尾

05:表名长度 5字节

6d 79 62 69 6e  00:表名mybin 0X00结尾

02:字段数量 2个字段

03:MYSQL_TYPE_LONG(4字节int类型)

0f:MYSQL_TYPE_VARCHAR(varchar类型)

02:metadata lenth

3c 00:metadata block 第一个字段不需要长度,第二个字段为可变类型长度为60

03:00000011 都可以为NULL

a1 23 ad 72:CRC32 校验4字节

到此为止:表中的说明数据就出来了,在MYSQLBINLOG中会看到

# at 513

#170206  3:10:50 server id 93157  end_log_pos 564 CRC32 0x72ad23a1      Table_map: `test`.`mybin` mapped to number 174

以及在表中

### INSERT INTO `test`.`mybin`

### SET

###   @1=1 /* INT meta=0 nullable=1 is_null=0 */

###   @2='gaopeng' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

信息:

CRC32 0x72ad23a1      Table_map: `test`.`mybin` mapped to number 174

明显来自Table_map_log_event

而且类似/* VARSTRING(60) meta=60 nullable=1 is_null=0 */

中的 VARSTRING(60) meta=60 nullable=1 都来自于

Table_map_log_event

并且可以看到和解析出来的一模一样

本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已在2020年6月升级到阿里云开发者社区。如果您发现有涉嫌抄袭的内容,请填写侵权投诉表单进行举报,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

网友评论

登录后评论

0/500

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值