從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:當前例項上執行過的事務集合;