跳過復制錯誤
mysql因為binlog機制問題,有些時候會出現從庫重放sql執行失敗的情況,特別是舊的STATEMENT模式最容易出現這種情況(因為函數和存儲過程等原因),這也是為什么強調使用mixed和row模式的原因。另外就是一些外部XA事務,因為XA事務日志不在mysql中,有時候會出現回滾失敗的情況,導致主從報錯。
出現這些狀況那該怎么辦好呢?如果是重做,雖然是可以,但是如果庫非常大,那耗時就不是一兩小時那么容易,如果是做了生產讀寫分離的,就不好交代了。這個時候我們可以選擇手動修改數據,然后跳過這個復制錯誤,然后這個主從復制就會重新運行了。
繼續講述兩種模式,先說的是GTID模式,他可以有兩種方式跳過。第一種是用得比較多的,注入空事務跳過:
#找到沖突的GTID號. mysql>show slave status\G 。 。 。 Executed_Gtid_Set: 09cb91bf-2669-11e7-8b70-00163e0835ff:1-83648451 。 。 。 #停止復制 mysql>stop slave; #然后執行設置一個事務GTID來跳過,因為我們就是卡在這里,所以要跳過83648451這個事務的意思 mysql>SET gtid_next = '09cb91bf-2669-11e7-8b70-00163e0835ff:83648451'; #注入空事務 mysql>BEGIN;COMMIT; #把GTID設置回自動模式 mysql>SET gtid_next = 'AUTOMATIC'; #重新開啟復制 mysql>START SLAVE; #這就可以跳過一個事務了,原理在于通過執行一個空事務代替master傳遞過來的沖突事務. #當然跳過了,并不代表這個數據就不修改了,還是要你手動去修改一下,這樣就一切回歸正常了 mysql>update tables set 。。。。。。。
第二種,直接跳過這個GTID,改做后面的
#找到沖突的GTID號. mysql>show slave status\G 。 。 。 Executed_Gtid_Set: 09cb91bf-2669-11e7-8b70-00163e0835ff:1-83648451 。 。 。 #停止復制 mysql>stop slave; #直接設置上面的GTID值+1 mysql>SET @@GLOBAL.GTID_PURGED='09cb91bf-2669-11e7-8b70-00163e0835ff:1-83648452'; #重新開啟復制 mysql>START SLAVE; #當然跳過了,并不代表這個數據就不修改了,還是要你手動去修改一下,這樣就一切回歸正常了 mysql>update tables set 。。。。。。。
然后就說傳統模式了,相對來說,更簡單一些
#停止復制 mysql>slave stop; #設定跳過一個事務 mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #重新開啟復制 mysql>slave start #這樣就正常了,但是,當然還是要把數據修改上去 mysql>update tables set 。。。。。。。
其實還有一個禁忌設定方式,可以跳過一些復制報錯,因為不建議,只是拿出來說說可以這么干
#修改配置文件 vim /etc/my.cnf [mysqld] #跳過指定error no類型的錯誤 #slave-skip-errors=1062,1053,1146 #跳過所有錯誤 #slave-skip-errors=all
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。