官术网_书友最值得收藏!

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,那么會發生什么呢?請大家思考一下。

主站蜘蛛池模板: 临洮县| 交口县| 通州区| 吉首市| 汕尾市| 南充市| 应城市| 芜湖县| 长宁区| 新竹县| 琼海市| 镇江市| 桓台县| 安庆市| 黑龙江省| 贡觉县| 蕲春县| 晋江市| 黄龙县| 泰州市| 峨眉山市| 启东市| 吴堡县| 青浦区| 新泰市| 澎湖县| 饶河县| 广饶县| 英德市| 梁平县| 淄博市| 博乐市| 山西省| 诸城市| 通州市| 绥中县| 开封市| 嘉善县| 肃宁县| 新河县| 嘉义县|