zoukankan      html  css  js  c++  java
  • 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 statusG" 找到发生复制错误的 GTID 事务号(示例只展示复制错误信息,其他信息省略),可以找到发生复制错误的 GTID 为:ab1b2733-2401-11e7-82fc-525400abbf4b:50

    root@(none) >show slave statusG
     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 重要:数据订正

  • 相关阅读:
    [noip2018]day1
    [CF1110d]JONGMAH
    BZOJ 2733 [HNOI2012]永无乡
    BZOJ 3123 [SDOI2013] 森林
    Nowcoder 练习赛26E 树上路径
    Luogu 2575 高手过招-SG函数
    BZOJ 1123[POI2008]BLO-Tarjan
    Nowcoder OI赛制测试2 F 假的数学题
    Luogu 2467[SDOI2010]地精部落
    Luogu 2216[HAOI2007]理想的正方形
  • 原文地址:https://www.cnblogs.com/moss_tan_jun/p/7846991.html
Copyright © 2011-2022 走看看