mysql5.6新特性GTID基本原理

小亮520cl發表於2015-10-23

[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來確定新備庫複製座標。

當然,使用GTID也有一些限制:
1.事務中的更新包含非事務性儲存引擎,這可能導致多個GTID分配給同一個事務。
2. create table…select語句不被支援,因為該語句會被拆分成create table 和insert兩個事務,並且這個兩個事務被分配了同一個GTID,這會導致insert被備庫忽略掉。
3.不支援CREATE/DROP臨時表操作

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

a.相關變數
主庫上每個事務的Gtid包括變化的部分和不變的部分。在討論之前,要弄清楚GTID維護的四個變數:
GTID_PURGED :已經被刪除的binlog的事務,它是GTID_EXECUTED的子集,從MySQL5.6.9開始,該變數無法被設定。
GTID_OWNED :  表示正在執行的事務的gtid以及對應的執行緒ID。
例如如下:

mysql> show global variables like ‘%gtid_owned%’\G

*************************** 1. row ***************************
Variable_name: gtid_owned
        Value: 7a07cd08-ac1b-11e2-9fcf-0010184e9e08:11560057#67:11560038#89:11560059#7:11560034#32:11560053#56:11560052#112:11560055#128:11560054#65:11559997#96:11560056#90:11560051#85:11560058#39:11560061#12:11560060#125:11560035#62:11560062#5
1 row in set (0.01 sec)
GTID_EXECUTED  表示已經在該例項上執行過的事務; 執行RESET MASTER 會將該變數置空; 我們還可以透過設定GTID_NEXT執行一個空事務,來影響GTID_EXECUTED
GTID_NEXT 是SESSION級別變數,表示下一個將被使用的GTID
在記憶體中也維護了與GTID_PURGED, GTID_OWNED, GTID_EXECUTED相對應的全域性物件gtid_state。
gtid_state中維護了三個集合,其中logged_gtids對應GTID_EXECUTED, lost_gtids對應GTID_PURGED,owned_gtids對應GTID_OWNED
參考:

原創文章,轉載請註明: 轉載自

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-1815862/,如需轉載,請註明出處,否則將追究法律責任。