DM数据迁移,因上下游调整表结构,导致DM迁移任务暂停,错误代码10006。

【 TiDB 使用环境】生产环境
【 TiDB 版本】7.5.1
【复现路径】DM数据迁移,因上下游调整表结构,导致任务暂停,错误代码10006。
【遇到的问题:问题现象及影响】

  1. resume-task操作不可行,这个可以理解,毕竟现有的任务已经出错了。
    2.先stop-task,再start-task,依旧报错10006,为什么没有重置任务,而是接着上个任务继续操作呢?那stop和resume还有什么区别?
    3.最后解决方案是通过新建一个不同名的任务,启动新的任务才得以解决。
    【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
    【附件:截图/日志/监控】

stop-task 命令用于停止数据迁移任务。有关 stop-taskpause-task 的区别,请参考暂停数据迁移任务中的相关说明。
stop就算任务结束了应该是,不能再启动了,pause 才是暂停,还能启动

10006就是上下游数据库表结构发生了调整,导致DM在同步数据时报的错。
这个要更新DM的配置文件,再重启重启DM迁移任务

那请问stop不具备清空任务,只能停止?如果这个任务坏了,我就只能新开任务吗?那我有100多个地市的任务,今天修改一个别名,明天修改一个别名,时间久了那怎么记得住哪一个是最后的?这不符合逻辑吧。如果一个java程序出问题了,难道我也要重新打包一个新的别名的包,然后启动吗?

从操作者的使用逻辑,不是应该通过命令停止/重构/清空现有任务,然后启动吗?如果更新配置文件,新建任务,那比如我有100+个地市的任务出问题了,难道停止后,都是去修改任务,再去启动新任务吗,这样对于分库分表的汇聚就增大了工作量。

stop-task后 start-task前的处理过程啥样的

https://docs.pingcap.com/zh/tidb/stable/handle-failed-ddl-statements

https://docs.pingcap.com/zh/tidb/stable/dm-create-task#参数解释

  • remove-meta:
    • 可选
    • 如果设置,则在启动指定任务时会移除该任务之前存在的 metadata

你需要在start-task的时候添加–remove-meta就会删除之前的元数据。就不需要另换一个taskname。

至于设计问题,这里处理的确实不太好。主要是缺乏和curd对应的操作。特别是更新就需要stop再start。其实就是删除再创建。但删除再创建的过程中,元数据又是默认保留的。

1 个赞

上下游表结构不一致的话去看看 set-schema 相关操作, 有可能是 cache 的表结构没更新导致的

他有两个解决方案:我使用第二种方法解决的。
1就是你这种 记录这个pos点。重新新建一个任务
2.我记得他有个自动更新表结构的
tiup dmctl --master-addr ${advertise-addr} binlog-schema update -s ${source-id} ${task-name} ${database-name} ${table-name} ${schema-file}

1 个赞

这个参数我用过,处理表结构修改之后DM还报错的问题

1 个赞

有没有试过delete表dm_meta.test_syncer_checkpoint中相关记录。然后重新启动task,重新触发一次表的全量同步?

remove-meta参数试了,一样报错

这个前提应该是两边列不一致才使用。当时报错的10006的时候,我看了上下游的结构,两边已经一致了,感觉问题还是卡在了任务里的事件的单条没执行完,就出现了两边不一致,然后就卡住暂停了。下次要是还出现 我试试您这个方法,

老师 您是正确的,我刚刚试了您说的第二种。

需要更新 DM 内保存的表结构,再 remove-meta 指定断点启动,这样才可以恢复