MySQL Master 如果意外的當掉, 重新開機.. 等等狀況, 造成 Replication 不會動, 通常會是 binlog 壞掉造成的, 通常看到這個能做的大多是重新把 Master 的資料倒出來, 再倒回 Slave, 然後重新開始, 但是當運氣不太好, 三天兩頭就有機器又燒起來的狀況, 就會去想更好的解法......

先來看看 Replication 出問題該怎麼查:

mysql -u root # 先進入 mysql

show slave status # 看看 Last_error 有沒有其它狀況(最常見是 Duplicate Key)

處理步驟:

  1. 若發現是 Slave_IO_Running: No, 然後沒有 Last_error:
  2. 那就先將 mysql restart 看看
  3. 還是沒有錯誤就去看 mysql error log(系統上的錯誤訊息, ex: /var/log/)
  4. 若 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 指到下一個正確的檔案即可.

做法如下:

  1. tail -10 xx.bin.025 > /tmp/xx.binlog # 會是很多行 SQL 的集合, 主要看 Primary key 就是了.
  2. 再來 去 SELECT 那些 Primary Key 是不是都已經被寫入了,
    通常都會被寫入成功(因為 Master 寫壞的, 一定都是最後一筆), 沒有寫入成功的再自行補上即可.
  3. 確認完此壞掉的 bin log 都已經寫完(除了最後那筆壞掉的外), 那就可以捨棄此檔了. 只要使用下面指令即可.
  4. CHANGE MASTER TO MASTER_LOG_FILE='xx-bin.026', MASTER_LOG_POS=4;
  5. 026 是 025 的下一個(Replication 是照順序的), 新 bin log 的MASTER_LOG_POS 開頭一定是 4, 所以這樣子設就可以跳到下一個檔案.
  6. 再 start slave, 等 DB(Slave) sync 後就可以上線了.
創作者介紹
創作者 kevin0523 的頭像
kevin0523

新‧夢想

kevin0523 發表在 痞客邦 留言(0) 人氣()