MySQL GTID 主從復制錯誤修復方法


https://yq.aliyun.com/articles/155827?spm=5176.8067842.tagmain.6.RFPTAL

MySQL 傳統的主從復制方式使用 master_log_files 和 master_log_pos 兩個參數來確定復制位點。當出現復制錯誤時,可以設置跳過出錯的事務來恢復同步,MySQL 提供了 sql_slave_skip_counter 參數來實現此功能。使用方法如下:

root@(none) >stop slave; Query OK, 0 rows affected (0.00 sec) root@(none) >SET GLOBAL SQL_SLAVE_SKIP_COUNTER = N; #跳過N個事務 Query OK, 0 rows affected (0.00 sec) root@(none) >start slave; Query OK, 0 rows affected, 1 warning (0.03 sec) 

如果使用 GTID 的主從復制方式,上面這種方法並不會生效。如果有同學做過嘗試,應該會收到如下報錯信息。

ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction

在 GTID 模式下使用 sql_slave_skip_counter 參數將會引發錯誤:

root@(none) >stop slave; Query OK, 0 rows affected (0.00 sec) root@(none) >set global sql_slave_skip_counter = 1; ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction 

那使用 GTID 復制的數據庫出現復制錯誤時該如何處理呢?其實上面的報錯信息已經提示了解決方法:在發生錯誤的 GTID 事務號上插入一個空的事務,來實現跳過此復制錯誤的效果。

操作方法:

1 "show slave status\G" 找到發生復制錯誤的 GTID 事務號(示例只展示復制錯誤信息,其他信息省略),可以找到發生復制錯誤的 GTID 為:ab1b2733-2401-11e7-82fc-525400abbf4b:50

root@(none) >show slave status\G
 1. row ** Last_Error: Worker 7 failed executing transaction 'ab1b2733-2401-11e7-82fc-525400abbf4b:50' at master log mysql-bin.000012, end_log_pos 156045; Could not execute Delete_rows_v1 event on table test.test2; Can't find record in 'test2', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log FIRST, end_log_pos 156045 

2 向上面找到的 GTID 插入一個空的事務

stop slave; # 關閉 slave 復制 SET GTID_NEXT='$GTID_NO'; # 設置 GTID_NEXT 為復制出錯的 GTID_NO begin; commit; # 向 $GTID_NO 寫入空事務 SET GTID_NEXT="AUTOMATIC"; # 重新設置 GTID_NEXT 為自動獲取 start slave; # 啟動 slave 復制 

示例:

root@(none) >stop slave; Query OK, 0 rows affected (0.00 sec) root@(none) >SET GTID_NEXT='ab1b2733-2401-11e7-82fc-525400abbf4b:50'; Query OK, 0 rows affected (0.00 sec) root@(none) >begin; Query OK, 0 rows affected (0.00 sec) root@(none) >commit; Query OK, 0 rows affected (0.00 sec) root@(none) >SET GTID_NEXT="AUTOMATIC"; Query OK, 0 rows affected (0.00 sec) root@(none) >start slave; Query OK, 0 rows affected, 1 warning (0.03 sec) 

3 重要:數據訂正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM