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