展开阅读全文
原创:转载请说明出处谢谢!
上接
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
http://blog.itpub.net/7728585/viewspace-2133429/ 解析MYSQL BINLOG 二进制格式(4)--TABLE_MAP_EVENT
class:Write_rows_log_event
event:WRITE_ROW_EVENT
event_code:30
自从5.1.18开始,row模式下的insert的event,为什么要叫write不叫insert
呢无赖...
这部分在internals文档中有点小的问题,我也是看了源码的描述才找到,
在文档中也写到[TODO:following needs verification;it's guesswork]
就是fixed data中有2 bytes的m_extra_row_data其值当前为
uint16 vhlen= 2;
uint16 vhpayloadlen= 0;
下面有部分源码截取。如果不知道这两个字节读取就会有问题。至少5.6,5.7都有的
老版本我也没有验证。
--fixed data 10字节(5.6,5.7中描述为 ROWS_HEADER_LEN_V2)
6 bytes 表ID
2 bytes 保留
2 bytes 文档中并没有描述
源码中描述为:
uchar *m_extra_row_data; /* Pointer to extra row data if any */
/* If non null, first byte is length */
源码中是这样写入的:
if (likely(!log_bin_use_v1_row_events))
{
/*
v2 event, with variable header portion.
Determine length of variable header payload
*/
uint16 vhlen= 2;
uint16 vhpayloadlen= 0;
uint16 extra_data_len= 0;
if (m_extra