- 深入理解MySQL主從原理
- 高鵬
- 834字
- 2021-04-16 16:29:27
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。
- Learn ECMAScript(Second Edition)
- Spring Boot 2實戰(zhàn)之旅
- 玩轉(zhuǎn)Scratch少兒趣味編程
- ReSharper Essentials
- Hands-On JavaScript High Performance
- JavaScript動態(tài)網(wǎng)頁開發(fā)詳解
- 表哥的Access入門:以Excel視角快速學習數(shù)據(jù)庫開發(fā)(第2版)
- Arduino家居安全系統(tǒng)構(gòu)建實戰(zhàn)
- HTML 5與CSS 3權(quán)威指南(第3版·上冊)
- Multithreading in C# 5.0 Cookbook
- Hands-On Full Stack Development with Spring Boot 2.0 and React
- Building Slack Bots
- Oracle Data Guard 11gR2 Administration Beginner's Guide
- Appcelerator Titanium:Patterns and Best Practices
- C#程序設(shè)計基礎(chǔ)入門教程