MySQL 5.7引入了全局事務(wù)標(biāo)識(shí)符(GTID),為多個(gè)MySQL復(fù)制實(shí)例之間實(shí)現(xiàn)更簡單和可靠的復(fù)制提供了基礎(chǔ)。GTID可以用于在以前不可能的情況下提高復(fù)制過程的可靠性,減少了許多配置和管理復(fù)制架構(gòu)時(shí)出現(xiàn)的常見問題。
GTID是對(duì)復(fù)制過程中一個(gè)單一事務(wù)的全局唯一的標(biāo)識(shí)符。每次在復(fù)制系統(tǒng)中添加新事務(wù)時(shí),它都會(huì)自動(dòng)為此事務(wù)生成一個(gè)唯一的GTID。GTID由三個(gè)部分組成:源ID、事務(wù)ID和事務(wù)提交號(hào)。在MySQL中,GTID使用字符串表示。
例如:0-1-5 其中,“0”是源ID,“1”是事務(wù)ID,“5”是提交號(hào)。
配置GTID復(fù)制時(shí),主服務(wù)器必須在每個(gè)事務(wù)提交時(shí)記錄其GTID。然后,它將GTID與要復(fù)制的數(shù)據(jù)一起發(fā)送到復(fù)制從服務(wù)器。復(fù)制從服務(wù)器使用GTID來確定哪些事務(wù)已經(jīng)發(fā)送,哪些尚未發(fā)送。它可以使用此信息來確保它復(fù)制的數(shù)據(jù)與主服務(wù)器上的數(shù)據(jù)完全匹配。
在GTID復(fù)制中,從服務(wù)器還可以根據(jù)GTID自動(dòng)跟蹤主服務(wù)器上已刪除事務(wù)的信息。這使得從服務(wù)器可以更好地處理復(fù)制拓?fù)渲械奶砑?刪除過程。我們不再需要使用以前的binlog復(fù)制拓?fù)鋪韺?shí)現(xiàn)高可用性方案,因?yàn)镚TID可以確保從服務(wù)器的所有更新都已傳遞到主服務(wù)器,并且在它們可能發(fā)生更改之前保持一致。
需要注意的是,GTID與MySQL的二進(jìn)制日志(binlog)密切相關(guān)。默認(rèn)情況下,MySQL將兩個(gè)GTID寫入binlog中:開始事務(wù)的GTID,以及提交事務(wù)的GTID。因此,必須確保您的binlog格式支持GTID,否則它將無法正常工作。此外,在使用GTID進(jìn)行復(fù)制時(shí),建議采用ROW日志格式,因?yàn)樵诖烁袷较拢琈ySQL可以使從服務(wù)器盡可能精確地復(fù)制數(shù)據(jù)。