記一次 MySQL 循環復制
有朋友的一對 MySQL 出現遠大于其他類似實例的大量更新。因為開啟了主備雙向復制和 log_slave_updates,所以首先猜測是不是有循環復制,主 stop slave 后暫時正常。看了下主上的 relay_log,驗證了這一點。幸而來回復制的只是監控用的心跳更新,不會搞壞數據。
但是 MySQL 會比較 server_id ,一般情況下是不會出問題的。于是又仔細看了下主上不正常的 relay_log ,發現其中 event 的 server_id 和當前的都不同。 問下來確實曾經在線改過 server_id。
想了下怎么觸發這個問題,在自己的實例上復現了一把
- 開啟 主->備 的復制
- 主上插入若干記錄
- 更改主的server_id
- 開啟 備->主 的復制
- 轟!
實際操作中,由于存在復制延時,即使沒有先停止備->的復制也有可能觸發問題。
然后就是怎么拆掉這個雷了。由于來回復制的只是心跳更新,所以只需要跳過就行,其實如果不是的話也已經完蛋沒法救了。首先想到的是 binlog_ignore_db 和 replicate_ignore_db 。但是這兩個不是動態變量,重啟一次服務代價太大。同事@Tachikoma 提醒我 change master 還有個 ignore_server_ids 選項。于是就只需要 change master to ignore_server_ids (1,2) 忽略之前的 server_id 就行。待復制正常,change master to ignore_server_ids () 就可以解除掉了。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!