- 概述:
- 當(dāng)使用GTIDs時,可以識別和跟蹤每一個事務(wù),因為它是在原始服務(wù)器上提交的,并由任何slave應(yīng)用;簡單來說就是master提交的所有事務(wù)都在slaves應(yīng)用一次,兩者的數(shù)據(jù)就能保證一致性,此外,同一GTID的事務(wù)只能在同一服務(wù)器上面提交一次。
- 格式:
- GTID表示為一對坐標(biāo),由冒號分隔(:)
- GTID = source_id:transaction_id
- source_id標(biāo)識原始服務(wù)器.通常,服務(wù)器的server_uuid用于此目的。transaction_id是一個序列號,由在該服務(wù)器上提交事務(wù)的順序決定;例如,要提交的第一個事務(wù)的transaction_id為1,而在同一個源服務(wù)器上提交的第十個事務(wù)的transaction_id為10。事務(wù)不可能將0作為GTID中的序列號。例如,在最初使用UUID 3E11FA47-71CA-11E1-9E33-C80AA9429562的服務(wù)器上提交的第23個事務(wù)具有以下GTID:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23 - 如在SHOW MASTER STATUS或SHOW SLAVE STATUS等語句的輸出中所寫,來自同一服務(wù)器的一系列GTID可以折疊成單個表達(dá)式,如此處所示
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
剛剛顯示的示例表示源自MySQL服務(wù)器的第一到第五個事務(wù),其server_uuid是3E11FA47-71CA-11E1-9E33-C80AA9429562。
- 生命周期:
- 事務(wù)在master上執(zhí)行并提交。此客戶端事務(wù)被分配一個GTID,該GTID由master的UUID和此服務(wù)器上尚未使用的最小非零事務(wù)序列號組成。GTID被寫入master的二進(jìn)制日志(緊接在日志中的事務(wù)本身之前)。如果未將客戶端事務(wù)寫入二進(jìn)制日志(例如,因為事務(wù)已被過濾掉,或者事務(wù)是只讀的),則不會為其分配GTID
- 如果為事務(wù)分配了GTID,則在提交時通過將其寫入事務(wù)開始時的二進(jìn)制日志(作為Gtid_log_event)以原子方式持久化GTID。無論何時旋轉(zhuǎn)二進(jìn)制日志或關(guān)閉服務(wù)器,服務(wù)器都會將寫入先前二進(jìn)制日志文件的所有事務(wù)的GTID寫入mysql.gtid_executed表。
- 如果為事務(wù)分配了GTID,則通過將GTID添加到gtid_executed系統(tǒng)變量(@@GLOBAL.gtid_executed)中的GTIDs集,以非原子方式外部化GTID(在提交事務(wù)之后不久)。此GTID集包含所有已提交的GTID事務(wù)集的表示形式,并在復(fù)制中用作表示服務(wù)器狀態(tài)的標(biāo)記。啟用二進(jìn)制日志記錄(根據(jù)master的要求),gtid_executed系統(tǒng)變量中的GTID集是應(yīng)用事務(wù)的完整記錄,但mysql.gtid_executed表不是,因為最新的歷史記錄仍在當(dāng)前二進(jìn)制日志文件中
- 將二進(jìn)制日志數(shù)據(jù)傳輸?shù)絪lave并存儲在slave的中繼日志中,然后slave讀取GTID并將其gtid_next系統(tǒng)變量的值設(shè)置為此GTID。這告訴slave必須使用此GTID記錄下一個事務(wù)。值得注意的是,slave在會話上下文中設(shè)置了gtid_next。
- slave驗證沒有線程在gtid_next中獲得GTID的所有權(quán)以便處理事務(wù)。通過首先讀取和檢查復(fù)制事務(wù)的GTID,在處理事務(wù)本身之前,slave不僅保證在slave上沒有應(yīng)用具有此GTID的先前事務(wù),而且還保證沒有其他會話已經(jīng)讀取此GTID但尚未提交的相關(guān)事務(wù)。因此,如果多個客戶端嘗試同時應(yīng)用同一事務(wù),則服務(wù)器只允許其中一個執(zhí)行,從而解決此問題。slave的gtid_owned系統(tǒng)變量(@@ GLOBAL.gtid_owned)顯示當(dāng)前正在使用的每個GTID以及擁有它的線程的ID。如果已經(jīng)使用了GTID,則不會引發(fā)錯誤,并且使用自動跳過功能來忽略該事務(wù)。
- 如果尚未使用GTID,則slave應(yīng)用復(fù)制的事務(wù)。由于gtid_next設(shè)置為master已分配的GTID,因此slave不會嘗試為此事務(wù)生成新的GTID,而是使用存儲在gtid_next中的GTID。
- 如果在slave上啟用了二進(jìn)制日志記錄,那么GTID將在提交時以原子方式持久化,方法是在事務(wù)開始時將其寫入二進(jìn)制日志(作為Gtid_log_event)。無論何時旋轉(zhuǎn)二進(jìn)制日志或關(guān)閉服務(wù)器,服務(wù)器都會將寫入先前二進(jìn)制日志文件的所有事務(wù)的GTID寫入mysql.gtid_executed表。
- 如果在slave上禁用二進(jìn)制日志記錄,則通過將GTID直接寫入mysql.gtid_executed表來原子性地保留GTID。MySQL向事務(wù)添加一條語句,將GTID插入到表中。在這種情況下,mysql.gtid_executed表是slave上應(yīng)用的事務(wù)的完整記錄。請注意,在MySQL 5.7中,將GTID插入表中的操作對于DML語句是原子操作,但對于DDL語句則不是,因此如果服務(wù)器在涉及DDL語句的事務(wù)之后意外退出,則GTID狀態(tài)可能會變得不一致。從MySQL 8.0開始,DDL語句和DML語句的操作都是原子操作。
- 在slave上提交復(fù)制事務(wù)之后不久,通過將GTID添加到slave的gtid_executed系統(tǒng)變量(@@ global.gtid_execute)中的GTIDs集合中,以非原子方式外部化GTID。對于master,這個GTID集合包含所有已提交GTID事務(wù)的集合的表示。如果在slave上禁用二進(jìn)制日志記錄,則mysql.gtid_executed表也是在slave上應(yīng)用的事務(wù)的完整記錄。如果在slave上啟用了二進(jìn)制日志記錄,則意味著某些GTIDs僅記錄在二進(jìn)制日志中,gtid_executed系統(tǒng)變量中的GTIDs集是唯一的完整記錄。
參考資料:https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html
作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。
創(chuàng)新互聯(lián)公司提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計、
成都做網(wǎng)站、網(wǎng)站設(shè)計、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運(yùn)營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價值。
PREV: 3:添加一個slave到已有的復(fù)制環(huán)境(基于二進(jìn)制日志文件位置) https://blog.51cto.com/itzhoujun/2351567
NEXT:5:使用GTID進(jìn)行復(fù)制 https://blog.51cto.com/itzhoujun/2352693
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
當(dāng)前題目:4:GTID簡單介紹-創(chuàng)新互聯(lián)
分享網(wǎng)址:
http://weahome.cn/article/djcoec.html