MySQL Replication Slave 同步失敗
前陣子在我的 MySQL Replication 運作期間,有發生網路斷線 (可能被貓踢到!?),造成資料同步發生錯誤。剛好之前有加了一個檢查的 Script,因此同步發生錯誤的時候 Slack 就會叫了,提醒我趕快把它修好。結果登入 MySQL Slave 輸入「SHOW SLAVE STATUS\G」查看,噴出以下「Relay log read failure 1594」錯誤,如下圖:
假的,資料庫業障重~意思就是說在處理 Relay_Master_Log_File 時發生錯誤,GG 惹。然後我們可以先用 mysqlbinlog 指令查一下發生錯誤的那一個 Commit 做了什麼事?查 Bin Log 之前我們先記下「SHOW SLAVE STATUS」訊息中的檔案名稱與 Parse 的位置 (Position)如上圖標示,可以由上述 Message 中的「Relay_Master_Log_File: mysql-bin.000204」與「Exec_Master_Log_Pos: 28570780」這兩個欄位取得資訊,然後執行以下命令:
mysqlbinlog mysql-bin.000204 --start-position=28570780
接著會 Parse 吐出指定 log file 中 position=28570780 與之後一筆的 Commit 資訊,如下:
看起來 28570780 這個失敗的 Commit 蠻無聊的 (其實是我看不懂.......),看起來無關緊要!?所以先跳過 28570780 直接執行 28570849。於 MySQL 輸入以下命令重新設定 MySQL Slave 的位置:
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO master_log_file='mysql-bin.000204',master_log_pos=28570849;
START SLAVE;
重新啟動 Slave 之後就搞定了,看起來運作貌似很正常。其實要跳過一筆 Commit 的執行,還有另外一種透過 sql_slave_skip_counter 的方式,如下:
SLAVE STOP;
SET GLOBAL sql_slave_skip_counter = 1;
SLAVE START;
上述兩種擇一服用即可,但如果有時候很衰造成資料庫已經很亂了,就需要跳過好幾筆資料才可以順利恢復同步狀態。之前還有遇過像是 Key 重複等等狀況,有時候要視情況修復資料後再繼續同步,這樣比較保險。
後記
之後還有發生過機器死當後重開不知道什麼原因 Bin Log 已經亂了,但資料其實已經同步完成,然而 MySQL Replication 卻無法啟動,可以在 MySQL Log File 看到以下資訊:
170406 8:55:31 [ERROR] Failed to open the relay log './mysqld-relay-bin.000017' (relay_log_pos 43940)
170406 8:55:31 [ERROR] Could not find target log during relay log initialization
這時候先停止 MySQL SLAVE 並且 RESET,請於 MySQL 執行以下命令:
STOP SLAVE;
RESET SLAVE;
然後移除目錄中的 Bin Log File(最好先備份!!)
sudo rm -rf /var/lib/mysql/mysqld-relay-bin.*
接著重新設定 MASTER 資訊後,重新啟動 MySQL Slave
RESET SLAVE;
CHANGE_MASTER …
START SLAVE;
在此筆記一下.......