Mysqlbinlog (2)

Posted on Jan 17, 2024

table_map_event

对于每次insert, update, delete操作,都会产生一个table_map_event,该event用于描述接下来event的数据所对应的表结构。

EventHead

filed bytes desc
timestamp 4 自1970-01-01 00:00:00以来的秒级数
eventType 1 当前event的类型
serverID 4 mysql server id
eventLength 4 当前even的字节长度
nextEventPos 4 下一个event的位置
flag 2

EventBody

filed bytes desc
tableid 6 table id
flags 2 flags
dbname variable 变长,第一个byte表示字符串长度,最后以0x00结尾
tablename variable 变长,第一个byte表示字符串长度,最后以0x00结尾
column_count variable column_count
coltype column_count * 1 column_types
metadatasize variable column_metadata_size
metadata metadatasize list of metadata for each column
nullbits int((column_count + 7) / 8) describe for column can be null or not
CRC32 4 event 校验码

column_count

column_count 表示event中包含的列数。所占空间大小计算

uint net_field_length_size(const uchar *ptr) {
 if (*ptr <= 251) return 1;
 if (*ptr == 252) return 3;
 if (*ptr == 253) return 4;
 return 9;
}

uint64_t net_field_length_ll(uchar **packet) {
 const uchar *pos = *packet;
 if (*pos < 251) {
   (*packet)++;
   return (uint64_t)*pos;
 }
 if (*pos == 251) {
   (*packet)++;
   return (uint64_t)NULL_LENGTH;
 }
 if (*pos == 252) {
   (*packet) += 3;
   return (uint64_t)uint2korr(pos + 1);
 }
 if (*pos == 253) {
   (*packet) += 4;
   return (uint64_t)uint3korr(pos + 1);
 }
 (*packet) += 9; /* Must be 254 when here */
 return (uint64_t)uint8korr(pos + 1);
}

column_count = net_field_length_ll

metadatasize

metadatasize = net_field_length_ll. 表示metadata字段的空间大小,所占空间大小计算 uint net_field_length_size(const uchar *ptr)

metadata

metadata 表示列的metadata信息

nullbits

nullbits 表示列是否可以为null

CRC32

CRC32 表示event校验码