tidb dm增量同步报错,上下游列数一致但是报错Column count doesn't match value count: 10 (columns) vs 14 (values)",

【 TiDB 使用环境】生产环境
【 TiDB 版本】v8.1.0 tidm版本:v8.1.0
【复现路径】mysql迁移整库数据到tidb,全量数据使用lightning同步,增量数据使用tidm开启incremental同步。
【遇到的问题:问题现象及影响】
会偶发性报Column count doesn’t match value count: 10 (columns) vs 14 (values)",的错导致同步流程停止,但是排查binlog以及下游表结构,列数是完全一致的。每次遇见报错会把dm_meta中的相关数据删除,重新配置gtid开启新的同步流程,但是运行一段时间还会出现类似错误,每次报错的表也不同,使用binlog-schema工具进行 delete 和 update 也没有用。有没有大佬帮忙看下问题。
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】






程序逻辑中有create table if exists之类的语句么

在源端单独把这条数据生成为insert语句看下,遇到过数据里有乱码导致生成的语句无法执行的情况

你好 是针对上游表的exists语句还是下游表的?

恢复下游数据就是用的源表生成的insert语句,应该没问题

上游的,我之前遇到过一个bug是这样的,Issues · pingcap/dm · GitHub
dm同步时候的bug .,看起来是修复了,不过不清楚你这里有没有遇到,所以需要排查下

感谢,我了解一下

您这个方向是对的,排查了下服务端日志,上游确实执行了相关语句,上游列数和tidm报错的列数一致!非常感谢大佬提供的思路!

会生成DDL之类的SQL么

客气,能解决就好

暂时没有发现

梳理了一下,是因为上游给业务了 create table权限,但是上面执行了 create table if not exists,而这个 SQL 里包含的表结构是老的表结构?

问题已经解决了吗?
是怎么样解决的?排查出来是什么问题?我们也学习一下

我们服务端使用的是nodejs,数据库交互的依赖是sequelize,该插件版本过低,服务重启时会根据每个实体类执行 create table if not exists语句,实体类的中的字段数没有更新,这时执行插入语句就会报错

上游数据库先执行的create table if not exists语句如果字段是错误的,再执行正确的插入语句就会报错。避免下create table if not exists语句的执行或者更新下实体类的字段 就ok了

看上去已经解决了吗

需要发版才能解决,现在是把报错必现了,代码规避下就行了

1 个赞

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。