dm同步过程中字段列个数不一致如何跳过

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.5
  • 【问题描述】:

dm同步过程中可能是因为大量skip-sql导致上游与下游数据库字段不一致,目前已经将下游tidb数据库表与mysql表手动同步一致。 resume-task后仍然报错字段长度不一致。 如何跳过改异常?

报错信息:

"Column count doesn't match value count: 49 (columns) vs 51 (values)\ngithub.com/pingcap/dm/syncer.genInsertSQLs\n\t/home/jenkins/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/dml.go:120\ngithub.com/pingcap/dm/syncer.(*Syncer).handleRowsEvent\n\t/home/jenkins/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1417\ngithub.com/pingcap/dm/syncer.(*Syncer).Run\n\t/home/jenkins/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1224\ngithub.com/pingcap/dm/syncer.(*Syncer).Process\n\t/home/jenkins/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:538\ngithub.com/pingcap/dm/syncer.(*Syncer).Resume\n\t/home/jenkins/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:2191\nruntime.goexit\n\t/usr/local/go/src/runtime/asm_amd64.s:1337\ngen insert sqls failed,

这个检测是检测到上下游表结构字段数量不一致,目前是手动修复上下游表结构完全一致了吗? 如果修复完全一致,可以尝试 stop-task 再 start-task 重启任务试下

完全一致,确认两个表字段都是49

  1. 尝试 stop-task 再 start-task 重启任务
  2. 当前同步位置点的 INSERT 语句插入的是 51 个字段还是 49 个字段?
  3. DM 版本是多少的?

1.stop-task 再 start-task 重启任务还是不行
2.同步位置点的 INSERT 语句如何查询?查询binlog?
3.版本
Release Version: v1.0.0-rc.1-13-g4abf188

麻烦提供一下 worker 的日志吧,看下日志中记录的语句信息

dm_work_20200327.log (4.3 MB)

看日志是在生成 INSERT 语句的时候报错了,应该是解析到 binlog 中 insert 语句有 51 个字段,但是下游表结构是 49 个字段。

可以通过 query-status 查看 task 任务目前同步到 binlog 位置点(syncerBinlog),确认下 Binlog 中的内容。 如果确认 Binlog 中 insert 内容是 51 个字段,需要跳过这一部分才可以

使用query-error查询不到该报错,使用query-status查询的binlog point无法跳过?

要怎么跳过?

查看官网sql-skip 是不是sql 正则模式只支持ddl,不支持dml?
目前无法通过query-error确定position位置,如何手动跳过?

可以通过指定同步开始 binlog 位置点的方式进行同步,确认上游可以正常开始同步的 binlog 位置点然后更新下游 checkpoint 位置信息