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

- Maven Build Customization
- Python從菜鳥到高手(第2版)
- DevOps入門與實踐
- PHP+MySQL網(wǎng)站開發(fā)項目式教程
- Android底層接口與驅(qū)動開發(fā)技術(shù)詳解
- Java實戰(zhàn)(第2版)
- Nagios Core Administration Cookbook(Second Edition)
- Android熱門應用開發(fā)詳解
- Access 2016數(shù)據(jù)庫應用與開發(fā):實戰(zhàn)從入門到精通(視頻教學版)
- IBM DB2 9.7 Advanced Application Developer Cookbook
- 前端Serverless:面向全棧的無服務器架構(gòu)實戰(zhàn)
- Learning Yeoman
- vSphere High Performance Cookbook(Second Edition)
- 物聯(lián)網(wǎng)及低功耗藍牙5.x高級開發(fā)
- Multithreading with C# Cookbook(Second Edition)