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

 

posted @ 2021-12-09 11:06  VicLW  阅读(1907)  评论(0编辑  收藏  举报