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

2.6 重點Event之UPDATE_EVENT和XID_EVENT

2.6.1 UPDATE_EVENT

1.UPDATE_EVENT的作用

UPDATE_EVENT是UPDATE語句生成的Event,主要用于記錄UPDATE語句的before_image實際數(shù)據(jù)和after_image實際數(shù)據(jù),其中還包含table_id、映像位圖、字段數(shù)量、行數(shù)據(jù)位圖等信息。

2.源碼重要接口

主庫

· 初始化構(gòu)造函數(shù):Update_rows_log_event::Update_rows_log_event(THD *thd_arg,TABLE tbl_arg,const Table_id& tid,bool is_transactional,const uchar extra_row_info)。

· 數(shù)據(jù)寫入函數(shù):Rows_log_event::do_add_row_data。

· 寫入binlog cache函數(shù):Rows_log_event::write_data_header,Rows_log_event::write_data_body。

從庫

· 讀取構(gòu)造函數(shù):Update_rows_log_event::Update_rows_log_event(const char *buf,uintevent_len,const Format_description_event *description_event)。

· 應用函數(shù):Rows_log_event::do_apply_event。

3.主體格式

UPDATE_EVENT的格式更加復雜一些,因此使用了更加豐富的區(qū)域來區(qū)別,如圖2-9所示。

其中,固定部分如下。

table_id:6字節(jié)。

Reserved:2字節(jié),保留以后使用。

可變部分如下。

var_header_len:當前2字節(jié),通常為0x02 00。

columns_width:字段個數(shù)。

columns_before_image:before_image為位圖,最少1字節(jié)。這里主要表示在Event中是否需要記錄全部的字段值,受到參數(shù) binlog_row_image 的影響,后面將單獨討論。如果參數(shù)binlog_row_image設置為FULL,則記錄為0xff。

columns_after_image:after_image為位圖,最少1字節(jié)。這里主要表示在Event中是否需要記錄全部的字段值,受到參數(shù) binlog_row_image 的影響,后面將單獨討論。如果參數(shù)binlog_row_image設置為FULL,則記錄為0xff。

圖2-9

注意:下列部分分為before_image和after_image,參見圖2-9。

row Bit-field:位圖,最少1字節(jié)。這個數(shù)據(jù)是行數(shù)據(jù)自帶的,也就是在構(gòu)造Event的時候傳入的。每位代表一個字段。如果字段有實際數(shù)據(jù)則為0,否則為1。

row real data:實際行數(shù)據(jù)。這是自帶的,按照字段排序。

4.實例解析

我們進行如下操作:

使用解析語句如下。

結(jié)果如下。

87 00 00 00 00 00:table_id為十六進制值87、十進制值135。

01 00:保留。

02 00:固定為0x02 00。

03:字段個數(shù)。

ff:columns_before_image,如果參數(shù)binlog_row_image設置為FULL,則固定為0xff。

ff:columns_after_image,如果參數(shù)binlog_row_image設置為FULL,則固定為0xff。

before_image

f8:before_image的row Bit-field,二進制值11111000,代表3列都有實際的數(shù)據(jù)。

29 00 00 00:實際數(shù)據(jù)為41。

07 67 61 6f 70 65 6e 67:0x07可變長度類型varchar的長度為7字節(jié),67 61 6f 70 65 6e 67為gaopeng字符串的ASCII編碼。

05 00 00 00:實際數(shù)據(jù)為5。

after_image

f8:after_image的row Bit-field,二進制值11111000,代表3列都有實際的數(shù)據(jù)。

29 00 00 00:實際數(shù)據(jù)為41。

06 79 61 6e 6c 65 69:0x06可變長度類型varchar的長度為6字節(jié),79 61 6e 6c 65 69為yanlei字符串的ASCII編碼。

05 00 00 00:實際數(shù)據(jù)為5。

這部分分為before_image和after_image,需要特別注意。如果我們將 before_image 和after_image完全交換會發(fā)生什么呢?請大家思考一下。

注意,STMT_END_F是一個標記,用于說明本Event是本 DML 語句的最后一個 DML Event。可以參考THD::binlog_flush_pending_rows_event函數(shù),如下。

主站蜘蛛池模板: 车险| 香港 | 苏州市| 囊谦县| 通道| 嘉定区| 平定县| 班玛县| 临武县| 佛教| 贡觉县| 乐昌市| 七台河市| 香港| 鄂伦春自治旗| 子长县| 汝州市| 平湖市| 衡阳县| 武定县| 砀山县| 简阳市| 隆林| 太康县| 东莞市| 积石山| 抚松县| 上犹县| 鹰潭市| 广昌县| 抚远县| 潢川县| 巫溪县| 萨嘎县| 昂仁县| 张家界市| 石渠县| 凤山县| 龙门县| 寿光市| 虹口区|