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

2.2 重點Event之 FORMAT_DESCRIPTION_EVENT和PREVIOUS_GTIDS_LOG_EVENT

2.2.1 FORMAT_DESCRIPTION_EVENT

1.FORMAT_DESCRIPTION_EVENT的作用

FORMAT_DESCRIPTION_EVENT是binary log的第一個Event。這個Event比較簡單,因為它攜帶的數(shù)據(jù)都是固定的,沒有可變部分。其中包含binary log的版本信息、MySQL的版本信息、Event_header的長度,以及每個Event type的固定部分的長度。

下列信息將會保存在從庫的內(nèi)存中:

(1)在從庫的內(nèi)存中保存主庫的信息,源碼變量是Master_info.mi_description_event。

(2)將從庫的relay log的FORMAT_DESCRIPTION_EVENT Event記錄為和主庫相同的值,它存儲在源碼變量Relay_log_info.rli_description_event中。Format_description_log_event::do _apply_event函數(shù)中,包含如下片段:

至少在以下場景下會讀取其中的信息:

(1)每次SQL線程應(yīng)用Event的時候都會獲取其Event_header的長度和相應(yīng)Event固定部分的長度。

(2)在I/O線程啟動的時候檢測版本,參考get_master_version_and_clock函數(shù)。

(3)將信息寫入relay log開頭的FORMAT_DESCRIPTION_EVENT。

它一定出現(xiàn)在binary log開頭,位置固定為#4。

2.源碼重要接口

主庫

· 初始化構(gòu)造函數(shù):Format_description_log_event::Format_description_log_event(uint8_t binlog_ver,const char* server_ver=0);

· 寫入binlog cache:Format_description_log_event::write(IO_CACHE* file)。

從庫

· 讀取構(gòu)造函數(shù):Format_description_log_event::Format_description_log_event(const char* buf,uint event_len,const Format_description_event *description_event);

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

3.主體格式

FORMAT_DESCRIPTION_EVENT沒有可變部分,如圖2-2所示。

圖2-2

其中,固定部分如下。

binlog_version:2字節(jié),binary log的版本為4。

server_version:50字節(jié),MySQL的版本為字符串形式。

create_timestamp:4 字節(jié),在 MySQL 每次啟動時,第一個 binary log 的 FORMAT_DESCRIPTION_EVENT都會記錄其啟動時間,在其他情況下為0。源碼中有如下解釋,供參考。

header_length:1字節(jié),Event header的長度當前為19。

array of post-header:當前MySQL版本為39字節(jié)。這是一個數(shù)組,用于說明每個Event類型的固定部分有多大。

4.實例解析

下面是一個FORMAT_DESCRIPTION_EVENT(mysqlbinlog--hexdump 輸出):

從第五行開始解析如下。

04 00:binary log的版本為4。

35 2e~00 00:當前MySQL的版本是5.7.22-22-debug-log。

98 94 ad 5c:小端顯示,因為本binary log是MySQL啟動以來的第一個binary log,所以這里就是相應(yīng)的啟動時間,十六進制值為5cad9498,十進制值為1554879640。轉(zhuǎn)換一下,時間如下:

13:Event header的長度,十進制值為19。

38 0d~00 01:不做解析,表示的是每個Event固定部分的大小。

5.生成時機

FORMAT_DESCRIPTION_EVENT作為binary log的第一個Event,一般都是在binary log切換的時候發(fā)生的。例如,flush binary logs命令;binary log自動切換;重啟MySQL實例。

注意,在本Event的Event header中,flags如果為 LOG_EVENT_BINLOG_IN_USE_F,則說明當前binary log沒有關(guān)閉(比如本binary log為當前寫入文件或者異常關(guān)閉MySQL實例)。如果異常關(guān)閉MySQL實例,那么會檢測這個值以決定是否做binary log recovery。

主站蜘蛛池模板: 寿阳县| 准格尔旗| 保定市| 石屏县| 佛山市| 新密市| 育儿| 益阳市| 个旧市| 同心县| 黄梅县| 界首市| 璧山县| 阳西县| 资阳市| 黑河市| 乳山市| 孟州市| 临江市| 宾阳县| 广德县| 湘潭市| 大名县| 张家口市| 巴东县| 新宾| 宁陵县| 大渡口区| 弋阳县| 乌鲁木齐市| 古浪县| 佛教| 襄垣县| 大方县| 大丰市| 布拖县| 揭东县| 武强县| 曲周县| 贞丰县| 云南省|