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

2.6 重點(diǎn)Event之UPDATE_EVENT和XID_EVENT

2.6.1 UPDATE_EVENT

1.UPDATE_EVENT的作用

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

2.源碼重要接口

主庫(kù)

· 初始化構(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。

從庫(kù)

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

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

3.主體格式

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

其中,固定部分如下。

table_id:6字節(jié)。

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

可變部分如下。

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

columns_width:字段個(gè)數(shù)。

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

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

圖2-9

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

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

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

4.實(shí)例解析

我們進(jìn)行如下操作:

使用解析語(yǔ)句如下。

結(jié)果如下。

87 00 00 00 00 00:table_id為十六進(jìn)制值87、十進(jìn)制值135。

01 00:保留。

02 00:固定為0x02 00。

03:字段個(gè)數(shù)。

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

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

before_image

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

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

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

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

after_image

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

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

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

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

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

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

主站蜘蛛池模板: 洞口县| 扎鲁特旗| 雅安市| 湟源县| 五常市| 靖宇县| 娱乐| 乐山市| 灵川县| 舒城县| 兴化市| 体育| 耿马| 徐闻县| 定南县| 乌拉特中旗| 临颍县| 大洼县| 大足县| 东城区| 贵定县| 阜新市| 远安县| 车致| 白朗县| 定襄县| 东海县| 宜宾县| 鸡泽县| 桐乡市| 山东省| 金塔县| 静乐县| 沈丘县| 攀枝花市| 温州市| 绥阳县| 三原县| 广宗县| 隆子县| 东源县|