MySQL GTID 主從複製錯誤修複方法
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 重要:數據訂正
最後更新:2017-08-13 22:39:29