《Mysql學習在MySQL中使用GTIDs復(fù)制協(xié)議和中斷協(xié)議的教程》要點:
本文介紹了Mysql學習在MySQL中使用GTIDs復(fù)制協(xié)議和中斷協(xié)議的教程,希望對您有用。如果有疑問,可以聯(lián)系我們。
?MySQL5.6有很多新的特性,其中很多人都感興趣的一條就是全局事務(wù)序號功能(GTIDs).而大家都對這一特性很感興趣的原因也很好理解,即:原來重新連接從服務(wù)器和一個新的主服務(wù)器一直是件很麻煩的事,然而在啟用GTIDs功能之后就變得簡單易行.可是,GTIDs的使用不單單是用單獨的標識符替換舊的二進制日志文件/位置,它也采用了新的復(fù)制協(xié)議.假如你還不太明白這些,那你可以在這篇文章里學點什么.
復(fù)制協(xié)議:新的 VS 舊的 MYSQL數(shù)據(jù)庫
舊的協(xié)議往往簡單直接即:首先從服務(wù)器上在一個特定的偏移量那里連接到一個給定的二進制日志文件,然后主服務(wù)器在從那里發(fā)送所有的事務(wù).MYSQL數(shù)據(jù)庫
新協(xié)議稍有不同:slave首先會發(fā)送它已經(jīng)執(zhí)行過的GTID的范圍,然后master發(fā)送每一個丟失的事務(wù). 它也確保了一個給定的GTID只可以在一個特定的slave中執(zhí)行一次.MYSQL數(shù)據(jù)庫
實踐中,這會改變?nèi)魏螙|西嗎? 使得,它會改變很多東西. 想象一下下面的場景: 你想要從trx 4開始復(fù)制,但是trx2在slave上因為某種緣故丟失了.?
MYSQL數(shù)據(jù)庫
MYSQL數(shù)據(jù)庫
?使用老協(xié)議的話,trx 2再也不會被執(zhí)行一次,而使用新協(xié)議,它就會被自動的再執(zhí)行一次.MYSQL數(shù)據(jù)庫
下面是兩個你可以在實踐中看到新協(xié)議的通用場景.MYSQL數(shù)據(jù)庫
跳過事務(wù)MYSQL數(shù)據(jù)庫
眾所周知老的 SET GLOBAL sql_slave_skip_counter = N 在你想要跳過一個事務(wù)時不再提供支持,而GTID就可以被啟用了. 換用 GTID XXX:N 來跳過事務(wù), 你須得 注入一個空的事務(wù):
?
MYSQL數(shù)據(jù)庫
mysql> SET gtid_next = 'XXX:N'; mysql> BEGIN; COMMIT; mysql> SET gtid_next = 'AUTOMATIC';
為什么我們不能使用 sql_slave_skip_counter? 就是因為新的復(fù)制協(xié)議!MYSQL數(shù)據(jù)庫
想象一下我們擁有如下圖所示的三臺服務(wù)器:?
MYSQL數(shù)據(jù)庫
MYSQL數(shù)據(jù)庫
?讓我們假設(shè) sql_slave_skip_counter 可以用并且已經(jīng)被用在S2上用于跳過trx2. 如果你吧S2設(shè)置成S1的一個slave將會發(fā)生什么呢?MYSQL數(shù)據(jù)庫
兩個服務(wù)器會互相交換被執(zhí)行了GTID的范圍,并且S1將會意識到其必需將trx2發(fā)送給S2. 然后會發(fā)生的事情有兩種可能:MYSQL數(shù)據(jù)庫
很明顯這不平安,這就是為什么 sql_slave_skip_counter 在使用GTID時是不能用的. 要想跳過一個事務(wù),唯一平安的選擇就是去執(zhí)行一個虛擬的事務(wù),而不是一個真實的事務(wù).
?
錯誤的事務(wù)MYSQL數(shù)據(jù)庫
如果你在一個slave上當?shù)貓?zhí)行了一個事務(wù) (在MySQL文檔中被稱為錯誤事務(wù)), 如果你被這個事務(wù)推送到新的master上時會發(fā)生什么呢?MYSQL數(shù)據(jù)庫
使用老協(xié)議,基本上沒啥事(準確點說,新的master和其slave之間的數(shù)據(jù)將會出現(xiàn)不一致,但那在稍后就可能會被修復(fù)).MYSQL數(shù)據(jù)庫
使用新協(xié)議,錯誤的事務(wù)將會被識別成為在每個地方都丟失了,并且將會自動在容錯備份上被執(zhí)行,這樣就將會導(dǎo)致打斷復(fù)制的隱患.MYSQL數(shù)據(jù)庫
比喻說,你擁有一個master(M)和兩個slave (S1 和 S2). 這里有兩種將slave重連到新的master將會發(fā)生(帶有不同復(fù)制錯誤的)失敗的場景:MYSQL數(shù)據(jù)庫
# 場景 1
?
MYSQL數(shù)據(jù)庫
# S1 mysql> CREATE DATABASE mydb; # M mysql> CREATE DATABASE IF NOT EXISTS mydb; # Thanks to 'IF NOT EXITS', replication doesn't break on S1. Now move S2 to S1: # S2 mysql> STOP SLAVE; CHANGE MASTER TO MASTER_HOST='S1'; START SLAVE; # This creates a conflict with existing data! mysql> SHOW SLAVE STATUS\G [...] Last_SQL_Errno: 1007 Last_SQL_Error: Error 'Can't create database 'mydb'; database exists' on query. Default database: 'mydb'. Query: 'CREATE DATABASE mydb' [...]
# 場景 2
?
MYSQL數(shù)據(jù)庫
# S1 mysql> CREATE DATABASE mydb; # Now, we'll remove this transaction from the binary logs # S1 mysql> FLUSH LOGS; mysql> PURGE BINARY LOGS TO 'mysql-bin.000008'; # M mysql> CREATE DATABASE IF NOT EXISTS mydb; # S2 mysql> STOP SLAVE; CHANGE MASTER TO MASTER_HOST='S1'; START SLAVE; # The missing transaction is no longer available in the master's binary logs! mysql> SHOW SLAVE STATUS\G [...] Last_IO_Errno: 1236 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.' [...]
你可以這樣理解,錯誤的事務(wù)應(yīng)該借助基于GTID的服務(wù)得以避免. 如果你需要運行一個當?shù)厥聞?wù),最好的選擇是針對那條特定的語句禁用二進制日志:
?
MYSQL數(shù)據(jù)庫
mysql> SET SQL_LOG_BIN = 0; mysql> # Run local transaction
結(jié)論MYSQL數(shù)據(jù)庫
GTIDs在讓我們便利重新和其他服務(wù)器連接副本方面是個不小的進步.然而同樣的在運維方面我們也因此面臨新的困難和挑戰(zhàn).假如你打算開始使用GTIDs,那么你就得確實理解新的復(fù)制協(xié)議,否則你就會以一種想不到的方式結(jié)束復(fù)制過程.
MYSQL數(shù)據(jù)庫
歡迎參與《Mysql學習在MySQL中使用GTIDs復(fù)制協(xié)議和中斷協(xié)議的教程》討論,分享您的想法,維易PHP學院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/8060.html