- 深入理解MySQL主從原理
- 高鵬
- 892字
- 2021-04-16 16:29:32
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ù),如下。

- Learn ECMAScript(Second Edition)
- Python快樂編程:人工智能深度學(xué)習(xí)基礎(chǔ)
- PostgreSQL for Data Architects
- Hands-On C++ Game Animation Programming
- Python 3破冰人工智能:從入門到實(shí)戰(zhàn)
- Spring實(shí)戰(zhàn)(第5版)
- Mastering JBoss Enterprise Application Platform 7
- Visualforce Developer’s guide
- Java語(yǔ)言程序設(shè)計(jì)教程
- 軟件項(xiàng)目管理實(shí)用教程
- Illustrator CS6設(shè)計(jì)與應(yīng)用任務(wù)教程
- 邊玩邊學(xué)Scratch3.0少兒趣味編程
- MongoDB Cookbook(Second Edition)
- Pandas 1.x Cookbook
- 高性能MVVM框架的設(shè)計(jì)與實(shí)現(xiàn):San