这篇文章上次修改于 368 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
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校验码
没有评论