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对比数据),保险起见,决定使用热备重做复制快速恢复。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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