mysqk主從同步從庫報Error_code: 1205 錯誤

最近兩天晚上,手機老收到報警信息,mysql從庫斷了,不知道什麼原因,主庫沒問題,從庫斷了,從庫上我們也沒做任何修改操作。最後通過日誌和詢問同時,發現從庫中有條這樣的sql,insert into b.b1 select from a.a1,這條語句剛開我也以爲對從庫同步沒啥影響,因爲只是查詢麼,但是感覺確實再沒其它問題了,通過發帖以及詢問公司同事,終於明白了,記錄一下


insert into b.b1 as select * from a.a1 會鎖住 a1 表,阻塞 a1 表上的寫操作,如果 slave sql 線程等待鎖的時間超過 innodb_lock_wait_timeout 的話,就會報  Error_code: 1205 錯誤,並重啓事務。

如果重啓事務的次數超過了 slave_transaction_retries,複製就中斷了。


也可以嘗試加大 slave_transaction_retries 的值,或者在 insert into b.b1 as select * from a.a1 前 stop slave,等insert 完成以後再 start slave。


具體原因主要是爲了mysql爲了保證binlog的一致性,


在 binlog_format = 'MIXED' 或者 'STATEMENT' 的時候,binlog 裏面保存的是 sql 語句,按事務的提交順序排列。
如果 insert into b.b1 as select * from a.a1 的時候不鎖住 a1 表,但同時執行了 update a1 的操作並在 insert 之前提交的話,在 binlog 裏 update 就會在 insert 之前,slave 或者數據庫恢復的時候使用了這樣的 binlog 就會產生和實際不一致的結果。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章