MySQL5.6 新特性(全局事務標示符(GTID))

 GTID的全稱爲 global transaction identifier  , 可以翻譯爲全局事務標示符,GTID在原始master上的事務提交時被創建。GTID需要在全局的主-備拓撲結構中保持唯一性,GTID由兩部分組成:

GTID = source_id:transaction_id


source_id用於標示源服務器,用server_uuid來表示,這個值在第一次啓動時生成,並寫入到配置文件data/auto.cnf中

transaction_id則是根據在源服務器上第幾個提交的事務來確定。


一個GTID的生命週期包括:

1.事務在主庫上執行並提交

給事務分配一個gtid(由主庫的uuid和該服務器上未使用的最小事務序列號),該GTID被寫入到binlog中。

2.備庫讀取relaylog中的gtid,並設置session級別的gtid_next的值,以告訴備庫下一個事務必須使用這個值

3.備庫檢查該gtid是否已經被其使用並記錄到他自己的binlog中。slave需要擔保之前的事務沒有使用這個gtid,也要擔保此時已分讀取gtid,但未提交的事務也不恩呢過使用這個gtid.

4.由於gtid_next非空,slave不會去生成一個新的gtid,而是使用從主庫獲得的gtid。這可以保證在一個複製拓撲中的同一個事務gtid不變。


由於GTID在全局的唯一性,通過GTID,我們可以在自動切換時對一些複雜的複製拓撲很方便的提升新主庫及新備庫,例如通過指向特定的GTID來確定新備庫複製座標。


主要的增強改進是添加了Global Transaction Identifiers (GTIDs)功能,爲了解決以下問題:

-能夠無縫的故障恢復和master與slave的切換

-能把slave指向新的master

-減少手工干預和降低服務故障時間



當然,使用GTID也有一些限制:

1.事務中的更新包含非事務性存儲引擎,這可能導致多個GTID分配給同一個事務。

2. create table…select語句不被支持,因爲該語句會被拆分成create table 和insert兩個事務,並且這個兩個事務被分配了同一個GTID,這會導致insert被備庫忽略掉。

3.不支持CREATE/DROP臨時表操作


可以看到,支持GTID的複製對一些語句都有一些限制,MySQL也提供了一個選項disable-gtid-unsafe-statements以禁止這些語句的執行。

參考:

http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html

http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-restrictions.html

http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html


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