- 深入理解MySQL主從原理
- 高鵬
- 875字
- 2021-04-16 16:29:27
2.2.2 PREVIOUS_GTIDS_LOG_EVENT
1.PREVIOUS_GTIDS_LOG_EVENT的作用
這個Event只包含可變部分。通常作為binary log的第二個Event,用于描述前面所有binary log包含的GTID SET(包括已經(jīng)刪除的)。
前面我們說過,初始化GTID模塊的時候也會掃描binary log中的這個Event。在relay log中同樣包含這個Event,主要用于描述I/O線程接收過哪些GTID,后面我們能看到MySQL實例初始化的時候可能掃描relay log中的這個Event來確認Retrieved_Gtid_Set,在4.7節(jié)會進行詳細介紹。
2.源碼重要接口
主庫
· 初始化構造函數(shù):Previous_gtids_log_event::Previous_gtids_log_event(const Gtid_set *set);
· 寫入binlog cache:Previous_gtids_log_event::write(IO_CACHE* file)。
從庫
· 讀取構造函數(shù):Previous_gtids_log_event::Previous_gtids_log_event(const char *buf,uint event_len,const Format_description_event *description_event);
· 本Event始終會被跳過,不會被SQL線程應用:Previous_gtids_log_event::do_shall_skip(Relay_log_info *rli)。
3.主體格式
整個寫入過程集中在Gtid_set::encode函數(shù)中,因為GTID SET中可能出現(xiàn)多個server_uuid,并且可能出現(xiàn)GTID SET Interval,因此是可變的。在Gtid_set::encode函數(shù)中,我們也可以清晰地看到它在循環(huán)掃描GTID SET中的每個server_uuid和每個GTID SET Interval,如下。

圖2-3展示了這種結構。

圖2-3
以下為可變部分。
· number of sids:8字節(jié),小端顯示,本GITD SET中server_uuid的數(shù)量。
· server_uuid:16字節(jié),GTID SET中的server_uuid。
· n_intervals:8字節(jié),本server_uuid中GTID SET Interval的數(shù)量。
· inter_start:8字節(jié),每個GTID SET Interval起始的gno。
· inter_next:8字節(jié),每個GTID SET Interval結尾的下一個gno。
注意:由于一個GTID SET可以包含多個server_uuid,所以第2到第5部分可能包含多個。如果某個server_uuid中還包含多個GTID SET Interval,則第4和第5部分也可能包含多個GTID SET Interval(參見圖2-3)。
4.實例解析
下面是一個PREVIOUS_GTIDS_LOG_EVENT(mysqlbinlog--hexdump 輸出),是由筆者手動刪除auto.cnf后構造出來的。

從第二排開始解析如下。
02 00 00 00 00 00 00 00:包含2個server_uuid。小端顯示就是2。
24 98 54 63 a5 36 11 e8 a3 0c 52 54 00 81 38 e4:第一個server_uuid。
01 00 00 00 00 00 00 00:n_intervals表示本GTID SET Interval的數(shù)量。小端顯示就是1。
01 00 00 00 00 00 00 00:inter_start,第一個GTID SET Interval起始的gno為1。
08 00 00 00 00 00 00 00:inter_next,第一個GTID SET Interval結尾的下一個gno為8。
6c ea 48 f6 92 6c 11 e9 b1 cb 52 54 00 81 38 e4:第二個server_uuid。
01 00 00 00 00 00 00 00:n_intervals表示本GTID SET Interval的數(shù)量。小端顯示就是1。
01 00 00 00 00 00 00 00:inter_start,第一個GTID SET Interval起始的gno為1。
05 00 00 00 00 00 00 00:inter_next,第一個GTID SET Interval結尾的下一個gno為5。
解析結果如下。
24985463-a536-11e8-a30c-5254008138e4:1-7
6cea48f6-926c-11e9-b1cb-5254008138e4:1-4
可以看到它們是一致的,只是inter_next應該減去了1,因為Event中記錄的是GTID SET Interval結尾的下一個gno。
5.生成時機
一般在binary log切換的時候,PREVIOUS_GTIDS_LOG_EVENT 作為第二個 Event寫入binary log。
- Docker and Kubernetes for Java Developers
- Linux C/C++服務器開發(fā)實踐
- JavaScript:Functional Programming for JavaScript Developers
- 基于Java技術的Web應用開發(fā)
- Learning Informatica PowerCenter 10.x(Second Edition)
- Data Analysis with IBM SPSS Statistics
- Python高效開發(fā)實戰(zhàn):Django、Tornado、Flask、Twisted(第3版)
- Python編程與幾何圖形
- Python:Master the Art of Design Patterns
- 智能手機APP UI設計與應用任務教程
- Quantum Computing and Blockchain in Business
- AutoCAD基礎教程
- XML程序設計(第二版)
- C++服務器開發(fā)精髓
- Android應用開發(fā)攻略