MySQL GTID複製的優缺點介紹

chenfeng發表於2017-01-09
GTID(Global Transaction ID)是對於一個已提交事務的編號,並且是一個全域性唯一的編號。
GTID實際上是由UUID+TID組成的。其中UUID是一個MySQL例項的唯一標識。TID代表了該例項上已經提交的事務數量,並且隨著事務提交單調遞增,最初由google實現,官方MySQL在5.6才加入該功能。
GTID是事務提交時建立分配的唯一識別符號,所有事務均與GTID一一對映。

GTID的優點:
1.根據GTID可以知道事務最初是在哪個例項上提交的
2.GTID的存在方便了Replication的Failover

GTID的缺點:
1.GTID 模式例項和非GTID模式例項是不能進行復制的,要求非常嚴格,要麼都是GTID,要麼都不是
2.gtid_mode 是隻讀的,要改變狀態必須1)關閉例項、2)修改配置檔案、3) 重啟例項
3.更新非事務引擎表
在同一事務中更新事務表與非事務表將導致多個GTIDs分配給同一事務

GTID的三個限制:
enforce-gtid-consistency=ON時,以下三類語句時不支援的

CREATE TABLE ... SELECT statements

CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE statements inside transactions

Transactions or statements that update both transactional and nontransactional tables. There is an exception that nontransactional DML is allowed in the same transaction or in the same statement as transactional DML, if all nontransactional tables are temporary.


而實際上這個限制沒有必要這麼嚴格,

CREATE TABLE ... SELECT statements

對於binlog_format=row, gtid_next='automatic'時可以放開限制。
生成的binlog包含兩個GTID, 一個是建表語句,一個是包含多個insert的事務。

事務中包含事務表和非事務表

對於gtid_next='automatic'時可以放開限制。
生成的binlog包含兩個GTID, 一個是所有非事務表的,一個是所有事務表的。
對update多表(包含事務表和非事務表)此時需額外要求binlog_format=row。

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

相關文章