說GTID - GTID的生命週期

1.事務提交時會獲取到一個GTID,該GTID將位於事務前面一同被記錄到二進制日誌中。若事務不被記錄到二進制日誌中,它也不會獲取到GTID。


2.事務的GTID會以Gtid_log_event的形式記錄到二進制日誌,當二進制日誌輪換或實例關閉時,MySQL會將所有已寫入二進制日誌的事務的GTID刷新到系統表mysql.gtid_executed。


3.事務提交後,極短時間內其GTID會被加入到一個GTID集合中(注意該過程不具有原子性),即全局系統變量gtid_executed,它代表全部已提交了的事務的GTID。在複製關係中,它也表明了該從實例已執行過哪些事務,主節點會據此判斷還需發送哪些GTID。


4.當二進制日誌傳送到從節點轉儲爲中繼日誌後,從節點會讀取GTID,在會話級別將該GTID賦值給會話系統變量gtid_next,這也就告訴了從節點接下來要執行的事務的GTID是什麼。


5.從節點會確認會話系統變量gtid_next中的GTID沒被佔用,然後爲其分配一個線程,並使用全局系統變量gtid_owned(@@GLOBAL.gtid_owned)標識出該GTID和使用它的線程的ID。若該GTID已被使用,就忽略該事務。


6.若此GTID沒被使用,從節點會回放該事務。從節點會使用會話系統變量gtid_next中的GTID,作爲該事務的GTID,而不會爲其重新生成GTID。


7.若從節點開啓了二進制日誌,該GTID會以Gtid_log_event的形式和事務一同記錄進二進制日誌。當二進制日誌輪換或實例關閉時,所有已提交事務的GTID又會被刷新到系統表mysql.gtid_executed(同2)。


8.若從節點沒開啓二進制日誌,MySQL會將回放該事務和將其GTID直接寫入系統表mysql.gtid_executed作爲一個事務進行,但在MySQL 5.7版本這還僅限於DML語句,在8.0版本,DDL也可以了。


9.當事務在從節點回放後,從節點上全局系統變量gtid_executed的變化同3。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章