分析:
-
尼瑪,不應該是連續的嘛,怎么會這么奇葩⊙﹏⊙b,這可如何是好呀,好捉急~~~ 莫急,且容我們慢慢分析為啥GTID從MASTER到SLAVE之后發生了斷點,產生了間隙。
情況1
-
正常滴,在MySQL 5.6啟用GTID后,部署REPLICATION復制時,可以設定 MASTER_AUTO_POSITION = 1,讓 SLAVE 根據 GTID 自動選擇適當的事務點進行復制,DBA基本上無需關注和擔心主從不一致的問題,還是很讓DBA省心的。
-
在啟用 MASTER_AUTO_POSITION = 1 的情況下,正常是不會發生 GTID 中間有個空隙,產生斷點的問題發生。除非是下面這種情況:
-
1、人工暫停SLAVE進程;
-
2、MASTER上繼續寫入數據;
-
3、MASTER上刷新LOG;
-
4、MASTER上刪除舊BINLOG,只保留最新的BINLOG;
-
5、SLAVE上啟動MASTER,這時候會報錯,像下面這樣:
-
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.'
-
-
針對這種問題的處理方法可以這么做:
-
1、關閉MASTER_AUTO_POSITION,即設置 MASTER_AUTO_POSITION = 0;
-
2、手工CHANGE BINLOG FILE & POS;
-
這種情況下,不能再次設置 MASTER_AUTO_POSITION = 1,否則還會再次報錯。
-
-
情況2
-
1、正常配置 REPLICATION 復制,但是設置 MASTER_AUTO_POSITION = 0,也就是人工指定 BINLOG FILE & POS的傳統方法;
-
2、在復制過程中,暫時關閉 SLAVE 進程;
-
3、手工修改 BINLOG FILE & POS 信息,指向新的 BINLOG FILE & POS 點;
-
4、啟動SLAVE,這時候就會發現 GTID 斷點的現象重現了;
-
在主從高可用模式下,可能主從間會發生切換,然后再次切換回來,這時候也可能發生上述的斷點問題。因此我們建議采用雙主來部署高可用切換,基本上可以實現任意來回切換,無需手工指定新的 BINLOG FIEE & POS 信息。
-
還有最后一種情況,就是在 MASTER 上執行了 RESET MASTER,導致 MASTER 上的 BINLOG FILE & POS 全部重置,SLAVE 上讀取到的信息自然也就不一致了。
-
好了,說了那么多,我們最后來說下如何應對處理 GTID 斷點的問題。
-
-
方法一:手工修改 BINLOG FILE & POS
-
1、關閉SLAVE;
-
2、手工CHANGE BINLOG FILE & POS,指向MASTER上最新產生的BINLOG FILE & POS,并且設置 MASTER_AUTO_POSITION = 0;
-
3、啟動SLAVE;
-
方法二:手工修改 GTID_PURGED 值
-
1、關閉 SLAVE;
-
2、在 SLAVE 上執行 RESET MASTER,重設 SLAVE 上的 BINLOG FILE & POS(如果這個節點用于復制中繼,要注意所有binlog是否都被讀取完畢,避免數據丟失);
-
3、在 SLAVE 上執行 SET @@GLOBAL.GTID_PURGED = '35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455';
-
4、啟動 SLAVE;
-
這種做法比較費解一點,意思是,我們告訴SLAVE要主動拋棄掉 MASTER 上傳輸過來的某些區間的事務。在這個例子中,我們拋棄了 1-2455 這個區間,也就是在 GTID 從 2466 開始,又會繼續應用 RELAY LOG 了,相比我們最開始的那個信息:
-
-
Retrieved_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-451
-
Executed_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455:792490-4517929
-
我們強制 SLAVE 只忽略 1-2455 這個區間,從 2466 開始繼續復制,消除了本來也會被忽略的區間: 792490-4517929,確保新產生的事務都會被繼續應用。這個做法可以參考MySQL手冊:Excluding transactions with gtid_purged。
-
-
還有另外一種費力不討好的做法,就是在 MASTER 上執行一些沒用的空事務,使得 GTID 的序號一直在加大,直到超過 2555 為止,然后在 792490-4517929 這個區間依法炮制一番,但我們非常不推薦采用這種做法,既麻煩又容易誤操作。 說了這么多,在 MySQL 5.6及以上版本中,我們強烈建議啟用 MASTER_AUTO_POSITION = 1,讓 MySQL 自己去做判斷,減少一些不必要的問題,并且采用雙主(其中一個主設為只讀)的方式,方便兩個主之間可以隨意相互切換,而不必擔心數據不一致。
-
-
上面過程我采用的MySQL版本:5.6.17-65.0-rel65.0-log Percona Server with XtraDB (GPL), Release rel65.0, Revision 587,實際案例發生的MySQL版本當時忘了記錄了,但肯定也是5.6以上的啦,哈哈~~~
原文:http://imysql.com/2014/07/31/mysql-faq-exception-replication-with-gtid.shtml