【Mysql】Mysql GTID複製程式出現異常,出現斷點
昨天處理了一個MySQL 5.6版本下開啟GTID模式複製異常案例,MASTER上的任何操作都無法在SLAVE上應用,SLAVE的RELAY LOG裡有記錄,但SLAVE的BINLOG卻找不到蛛絲馬跡。由於開啟了GTID,所以排查起來也簡單,只需要在SLAVE上把RELAY LOG和BINLOG分別解析成文字檔案,再直接搜尋MASTER的UUID,就能找到SLAVE上是否應用了MASTER複製過來的事務。 排查過程中,曾經一度懷疑是因為設定了BINLOG-DO或者IGNORE規則,或者設定了REPLICATION-DO或IGNORE規則,甚至是GTID的嚴重BUG,但都沒發現端倪。直到從 SHOW SLAVE STATUS 裡發現下面這個資訊:
點選(此處)摺疊或開啟
-
[yejr@imysql.com]> show slave status\G
-
*************************** 1. row ***************************
-
Slave_IO_State: Waiting for master to send event
-
... Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 2539 Relay_Log_File: mysql-relay-bin.000003
-
Relay_Log_Pos: 1996 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes
-
Slave_SQL_Running: Yes
-
# 兩個執行緒工作正常
-
Replicate_Do_DB:
-
Replicate_Ignore_DB:
-
Replicate_Do_Table:
-
Replicate_Ignore_Table:
-
Replicate_Wild_Do_Table:
-
Replicate_Wild_Ignore_Table:
-
#沒設定任何規則
-
Last_Errno: 0
-
Last_Error:
- Skip_Counter: 0
-
Exec_Master_Log_Pos: 2539 # 無論binlog file 還是 pos,都和MASTER保持一致,也就是說BINLOG的接收和RELAYR LOG的APPLY都很正常,有條不紊工作著
-
Relay_Log_Space: 2778
-
Until_Condition: None
-
Until_Log_File:
-
Until_Log_Pos: 0
-
...
-
Seconds_Behind_Master: 0
-
Master_SSL_Verify_Server_Cert: No
-
Last_IO_Errno: 0
-
Last_IO_Error:
-
Last_SQL_Errno: 0
-
Last_SQL_Error:
-
Replicate_Ignore_Server_Ids:
-
# 沒設定忽略某些 server-id 上的BINLOG
-
Master_Server_Id: 123315
-
Master_UUID: 35cc99c6-0297-11e4-9916-782bcb2c9453
- Master_Info_File: /data/db11_3316/master.info
- SQL_Delay: 0 # 沒有設定複製延遲策略
-
SQL_Remaining_Delay: NULL
-
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
-
Master_Retry_Count: 4294967295
-
Master_Bind:
-
Last_IO_Error_Timestamp:
-
Last_SQL_Error_Timestamp:
-
Master_SSL_Crl:
-
Master_SSL_Crlpath:
- Retrieved_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-451
- Executed_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455:792490-4517929 Auto_Position: 1
從上面的日誌發現什麼了沒?尤其是這兩行點選(此處)摺疊或開啟
- Retrieved_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-4517929
- Executed_Gtid_Set: 35cc99c6-0297-11e4-9916-782bcb2c9453:1-2455:792490-4517929 Auto_Position: 1
這下有點明白了吧,意思是
1、SLAVE從MASTER上覆制了GTID範圍是:1-4517929;
2、SLAVE上執行GTID的範圍分為兩段,一段是:1-2455,另一段是:792490-4517929;
分析:
-
尼瑪,不應該是連續的嘛,怎麼會這麼奇葩⊙﹏⊙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以上的啦,哈哈~~~
-
尼瑪,不應該是連續的嘛,怎麼會這麼奇葩⊙﹏⊙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以上的啦,哈哈~~~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2054962/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL GTID複製中斷修復過程MySql
- MySQL主從複製之GTID複製MySql
- MySQL 8 複製(四)——GTID與複製MySql
- MySQL 8 複製(五)——配置GTID複製MySql
- Mysql基於GTID的複製模式MySql模式
- Mysql 基於GTID主從複製MySql
- MySQL GTID複製錯誤修復演示MySql
- 連線MySQL時出現1449與1045異常解決辦法MySql
- MySQL 5.7基於GTID的主從複製MySql
- MySQL 5.7 基於GTID搭建主從複製MySql
- MySQL8.0輕鬆搞定GTID組複製MySql
- MySQL 傳統複製與 GTID 複製原理及操作詳解MySql
- mysql實現主從複製MySql
- Java常出現的異常解決方法總結(不斷更新)Java
- MySQL 複製全解析 Part10 基於GTID的MySQL複製的一些限制MySql
- MySQL運維實戰(7.1) 開啟GTID複製MySql運維
- 專案02(Mysql gtid複製故障處理01)MySql
- MySQL8.0輕鬆搞定GTID主從複製MySql
- MySQL8.0輕鬆搞定GTID主主複製MySql
- mysql連表查詢出現資料重複MySql
- mysql過濾複製的實現MySql
- docker實現mysql主從複製DockerMySql
- MySQL 複製全解析 Part 9 一步步搭建基於GTID的MySQL複製MySql
- Pycharm複製程式碼時括弧前出現空格PyCharm
- MySQL案例-並行複製亂序提交引起的同步異常MySql並行
- Mysql 8.4.0 結合 Docker 搭建GTID主從複製,以及傳統主從複製MySqlDocker
- mysql資料庫實現主從複製MySql資料庫
- MySQL主從複製之GTID模式詳細介紹鞴嬈MySql模式
- mysql GTID主從複製故障後不停機恢復同步流程MySql
- MySQL複製MySql
- 如何處理MySQL經常出現CPU佔用率達到99%MySql
- Mysql實現主從複製(一主雙從)MySql
- 簡單實踐實現 MySQL 主從複製MySql
- 從 MySQL 到 ClickHouse 實時複製與實現MySql
- mysql 安裝出現的問題MySql
- mysql複製那點事(2)-binlog組提交原始碼分析和實現MySql原始碼
- Android Studio 3.1.1 打Jar包出現AGPBI異常AndroidJAR
- MySQL:mysqldump 匯出資料異常重啟及drop棧幀MySql
- Mysqldump實現mysql的master-slave主從複製MySqlAST