深入理解MySQL主从原理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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,那么会发生什么呢?请大家思考一下。