跳過複制錯誤
mysql因為binlog機制問題,有些時候會出現從庫重放sql執行失敗的情況,特别是舊的STATEMENT模式最容易出現這種情況(因為函數和存儲過程等原因),這也是為什麼強調使用mixed和row模式的原因。另外就是一些外部XA事務,因為XA事務日志不在mysql中,有時候會出現復原失敗的情況,導緻主從報錯。
出現這些狀況那該怎麼辦好呢?如果是重做,雖然是可以,但是如果庫非常大,那耗時就不是一兩小時那麼容易,如果是做了生産讀寫分離的,就不好交代了。這個時候我們可以選擇手動修改資料,然後跳過這個複制錯誤,然後這個主從複制就會重新運作了。
繼續講述兩種模式,先說的是GTID模式,他可以有兩種方式跳過。第一種是用得比較多的,注入空事務跳過:
<code>#找到沖突的GTID号.</code>
<code>mysql>show slave status\G</code>
<code> </code><code>。</code>
<code>Executed_Gtid_Set: 09cb91bf-2669-11e7-8b70-00163e0835ff:1-83648451</code>
<code>#停止複制</code>
<code>mysql>stop slave;</code>
<code>#然後執行設定一個事務GTID來跳過,就是要跳過這個事務的意思</code>
<code>mysql>SET gtid_next = </code><code>'09cb91bf-2669-11e7-8b70-00163e0835ff:1-83648451'</code><code>;</code>
<code>#注入空事務</code>
<code>mysql>BEGIN;COMMIT;</code>
<code>#把GTID設定回自動模式</code>
<code>mysql>SET gtid_next = </code><code>'AUTOMATIC'</code><code>;</code>
<code>#重新開啟複制</code>
<code>mysql>START SLAVE;</code>
<code>#這就可以跳過一個事務了,原理在于通過執行一個空事務代替master傳遞過來的沖突事務.</code>
<code>#當然跳過了,并不代表這個資料就不修改了,還是要你手動去修改一下,這樣就一切回歸正常了</code>
<code>mysql>update tables </code><code>set</code> <code>。。。。。。。</code>
第二種,直接跳過這個GTID,改做後面的
<code>#直接設定上面的GTID值+1</code>
<code>mysql>SET @@GLOBAL.GTID_PURGED=</code><code>'09cb91bf-2669-11e7-8b70-00163e0835ff:1-83648452'</code><code>;</code>
然後就說傳統模式了,相對來說,更簡單一些
<code>mysql>slave stop;</code>
<code>#設定跳過一個事務</code>
<code>mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1</code>
<code>mysql>slave start</code>
<code>#這樣就正常了,但是,當然還是要把資料修改上去</code>
其實還有一個禁忌設定方式,可以跳過一些複制報錯,因為不建議,隻是拿出來說說可以這麼幹
<code>#修改配置檔案</code>
<code>vim </code><code>/etc/my</code><code>.cnf</code>
<code>[mysqld]</code>
<code>#跳過指定error no類型的錯誤</code>
<code>#slave-skip-errors=1062,1053,1146</code>
<code>#跳過所有錯誤</code>
<code>#slave-skip-errors=all</code>
本文轉自arthur376 51CTO部落格,原文連結:http://blog.51cto.com/arthur376/1969935,如需轉載請自行聯系原作者