Site icon Soul & Shell Blog

解決 MySQL Replication「Relay log read failure 1594」同步錯誤問題

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;

在此筆記一下.......

Exit mobile version