星期四, 十二月 21, 2006
MySQL Master Crash, Slave Replication 快速修復
MySQL Master 如果意外的當掉, 重新開機.. 等等狀況, 造成 Replication 不會動, 通常會是 binlog 壞掉造成的, 通常看到這個能做的大多是重新把 Master 的資料倒出來, 再倒回 Slave, 然後重新開始, 但是當運氣不太好, 三天兩頭就有機器又燒起來的狀況, 就會去想更好的解法......
先來看看 Replication 出問題該怎麼查:
mysql -u root # 先進入 mysql
show slave status # 看看 Last_error 有沒有其它狀況(最常見是 Duplicate Key)
處理步驟:
- 若發現是 Slave_IO_Running: No, 然後沒有 Last_error:
- 那就先將 mysql restart 看看
- 還是沒有錯誤就去看 mysql error log(系統上的錯誤訊息, ex: /var/log/)
- 若 mysql error log 還是空的, 代表 mysql 之前應該沒有停完全, mysql stop (ps auxwww 看看, 不行就 kill), 再 start, 應該就有錯誤訊息了.
再來若錯誤訊息看到的是 xx bin log 壞掉, 就是本篇要討論的重點.
mysql bin log 是 Master 的 SQL 指令寫入, 再傳遞到 Slave, Slave 去執行那 bin log 的指令, 若 Master 來的 bin log 壞掉了, 那 Slave 就會停止此動作, 等到人來手動修復 bin log.
通常會用 mysqlbinlog xx.bin.025(filename) > /tmp/xx.binlog, 將 bin log 的內容都倒出來, 然後找到出問題的資料, 記錄下一筆Pos, 然後用 CHANGE MASTER TO ..... 將記錄指到下一筆的 Pos 就可以繼續開始.
但是現在遇到的狀況就是, mysqlbinlog 也沒辦法正常的將 bin log 倒出來(bin log 檔 因異常當機, 沒寫完整, 壞掉了).
那解法也很簡單, 因為是異常寫壞了, 就先檢查看看 Slave 寫到哪一筆了, 補齊後, 再把 Pos 指到下一個正確的檔案即可.
做法如下:
- tail -10 xx.bin.025 > /tmp/xx.binlog # 會是很多行 SQL 的集合, 主要看 Primary key 就是了.
- 再來 去 SELECT 那些 Primary Key 是不是都已經被寫入了,
通常都會被寫入成功(因為 Master 寫壞的, 一定都是最後一筆), 沒有寫入成功的再自行補上即可. - 確認完此壞掉的 bin log 都已經寫完(除了最後那筆壞掉的外), 那就可以捨棄此檔了. 只要使用下面指令即可.
CHANGE MASTER TO MASTER_LOG_FILE='xx-bin.026', MASTER_LOG_POS=4;- 026 是 025 的下一個(Replication 是照順序的), 新 bin log 的MASTER_LOG_POS 開頭一定是 4, 所以這樣子設就可以跳到下一個檔案.
- 再 start slave, 等 DB(Slave) sync 後就可以上線了.
發表迴響
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~





