GTID介紹

酸蘿蔔別吃發表於2021-03-12

從MySQL5.6開始增加GTID這個特性,Global Transaction ID,全域性事務ID,用來強化主從資料庫的一致性,故障恢復,以及容錯能力,來替代傳統的人工的主從複製;

有了GTID,在進行主備切換的時候,slave們可以自動在新的master上找到複製位置(position),大大簡化了複雜複製叢集的維護工作,減少了人為設定position的風險,減少了資料不一致性的風險;

**GTID的組成:**

GTID=server_uuid:transaction_id

server_uuid指的是MySQL的uuid,在第一次啟動MySQL時生成,儲存在auto.cnf中;

transaction_id是事務的id,是一個從1開始的自增計數,表示在這個主庫上執行的第幾個事務;

比如:

b6af5b5c-666f-11e9-bed3-000c29b85ea6:1,第一個事務

b6af5b5c-666f-11e9-bed3-000c29b85ea6:1-5,第1到第5個事務

**GTID複製的工作原理**

1. master在執行更新操作時,會在事務執行時生成一個GTID,然後把GTID一起記錄到binlog中;

2. slave的IO執行緒去讀取master的binlog變更,寫入自己的relay-log中;

3. slave從relay-log中取出GTID,比較自己的binlog中是否有次GTID;

4. 如果slave的binlog中有此GTID,則說明該事務已經執行過,不再執行;

5. 如果slave的binlog中沒有次GTID,則執行該事務,並記錄到自己的binlog中;

**GTID複製的優點**

1. 傳統的主從複製,需要手動指定binlog和position,這樣比較麻煩,也很容易出錯,在master的寫操作頻繁時,也很難確定position;在GTID複製下,只需要指定MASTER_AUTO_POSITION=1,MySQL就會通過內部機制,自動找點同步;

簡單來說,就是簡化了複製,因為position是實時更新的,不方便手工指定,所以,GTID可以自動找到position進行同步;

2. GTID支援基於庫的多執行緒複製,在MySQL5.6以前,slave的複製是單執行緒的,只能一個事件一個事件進行;所以,我們可以把一個表放在一個庫裡,一個庫一個執行緒,這樣就可以實現多執行緒複製;但是,當只有一個庫的時候,多執行緒複製是沒有用的;

**GTID相關變數**

gtid_mode=on:開啟GTID;

gtid_executed:當前例項上執行過的事務集合;