• MySQL Errno:1782错误处理


    今天测试环境一套MySQL 8.0.16主从出现Errno:1782错误,详细报错如下:

    Worker 1 failed executing transaction 'NOT_YET_DETERMINED' at master log mysql-bin.000029, end_log_pos 33350454; Error executing row event: '@@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.'

    该问题常见于5.7及以前版本:https://bugs.mysql.com/bug.php?id=85480

    通过位点解析relay log发现日志里包含一个没有生成GTID和BEGIN的COMMIT操作产生匿名事务,导致复制异常,日志内容如下。

    从日志信息来看,当执行到COMMIT时,由于没有设置GTID_NEXT,因此MySQL认为该事务未匿名事务,SQL线程异常停止

    网上关于错误“Row event for unknown table”的资料较少,查到资料解释大意是在建立table map信息丢失导致。

    参考链接:

    https://bugs.mysql.com/bug.php?id=60964
    https://www.jianshu.com/p/4e28f09b3ce5

    上面的情况是跳过"SET @@SESSION.GTID_NEXT" 和"BEGIN"两部分,而如果只跳过"SET @@SESSION.GTID_NEXT",则执行BEGIN时,会报如下错误:

    Last_Errno: 1782
    Last_Error: Error '@@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.' on query. Default database: ''. Query: 'BEGIN'

    位于该错误位点的GTID为“7efd338e-ee5e-11ea-8957-000c29bed658:5634856”,而从库执行过的GTID为“7efd338e-ee5e-11ea-8957-000c29bed658:5634856”,由于缺少GTID_NEXT标识事务,从库无法判定该事务是否已在从库上执行,也就无法自动跳过该事务。

    修复尝试,通过重新开启GTID可以修复此问题,使主从正常同步:

    #关闭GTID
    stop slave sql_thread;
    SET GLOBAL GTID_MODE = 'OFF_PERMISSIVE';
    SET GLOBAL GTID_MODE = 'ON_PERMISSIVE';
    SET GLOBAL GTID_MODE = 'ON';
    start slave sql_thread;
    #此时start slave会出现Errno: 1781异常
    
    #开启GTID
    SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
    SET GLOBAL GTID_MODE = ON_PERMISSIVE;
    SET GLOBAL GTID_MODE = ON;
    start slave;

    但是由于以上错误显示先执行的GTID大于后生成的GTID,所以无法确保数据是否存在差异(当然可以使用pt-checksum对比数据),保险起见,决定使用热备重做复制快速恢复。

  • 相关阅读:
    配置WebLogic的详细步骤
    安装WebLogic的详细步骤
    syswrite 函数
    利用perl 改写awk统计
    第一章 输入和输出基础
    CIO必看:跨国集团采购部报表系统的建设经验分享
    价值5000元的web报表分享
    价值5000元的web报表分享
    分页语句 where 条件列和Order by 列 引导列的问题
    Java中final修饰参数的作用
  • 原文地址:https://www.cnblogs.com/VicLiu/p/15666160.html
Copyright © 2020-2023  润新知