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对比数据),保险起见,决定使用热备重做复制快速恢复。