解析MYSQL BINLOG 二进制格式(4)–TABLE_MAP_EVENT

原创:转载请说明出处谢谢!
上接
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
并且可以看到和解析出来的一模一样

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 解析MYSQL BINLOG 二进制格式(4)–TABLE_MAP_EVENT

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址