2.5.2 DELETE_EVENT
1.DELETE_EVENT的作用
本Event是DELETE语句生成的Event,主要用于记录DELETE语句的before_image实际数据,其中还包含table_id、映像位图、字段数量、行数据位图等信息。
2.源码重要接口
主库
· 初始化构造函数:Delete_rows_log_event::Delete_rows_log_event(THD* ,TABLE* ,const Table_id& table_id,bool is_transactional,const uchar* extra_row_info)。
· 数据写入函数:Rows_log_event::do_add_row_data。
· 写入binlog cache函数:Rows_log_event::write_data_header,Rows_log_event::write_data_body。
从库
· 读取构造函数:Delete_rows_log_event::Delete_rows_log_event(const char *buf,uint event_len,const Format_description_event *description_event)。
· 应用函数:Rows_log_event::do_apply_event。
3.主体格式
本Event的主体格式如图2-8所示。
其中,固定部分如下。
table_id:6字节。
Reserved:2字节,保留以后使用。
可变部分如下。
var_header_len:当前2字节,通常为0x02 00。
columns_width:字段个数。
columns_before_image:before_image位图,最少1字节。这里主要表示Event中是否需要记录全部字段值,受到参数binlog_row_image影响,后面会单独讨论。这里需要记住,如果参数binlog_row_image被设置为FULL,则记录为0xff。
row Bit-field:位图,最少1字节。这个数据是行数据自身携带的,也就是构造Event的时候传入的,每位代表一个字段。如果字段有实际数据则为0,否则为1。
row real data:实际行数据。这是自带的,按照字段排序。
图2-8
4.实例解析
我们进行如下操作。
使用解析语句如下。
结果如下。
解析如下。
7e 00 00 00 00 00:table_id,十六进制值7e,即十进制值126。
01 00:保留。
02 00:固定为0x02 00。
03:字段个数。
ff:columns_before_image,如果参数binlog_row_image设置为FULL,则固定为0xff。
f8:位图,二进制值11111000,代表3列都有实际的数据。
01 00 00 00:实际数据为1。
07 67 61 6f 70 65 6e 67:0x07表示可变长度类型varchar的长度为7字节,67 61 6f 70 65 6e 67为gaopeng字符串的ASCII编码。
03 00 00 00:实际数据为3。
这个解析过程和WRITE_EVENT的解析过程的区别在于Event header的type。如果将WRITE_EVENT的type改为 DELETE_EVENT,将DELETE_EVENT的type改为WRITE_EVENT,那么会发生什么呢?请大家思考一下。