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 @   VicLW  阅读(1996)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2019-12-09 PostgreSQL 执行计划
2019-12-09 PostgreSQL Autovacuum和vacuum
点击右上角即可分享
微信分享提示