DM在连接中断,重启任务时候没有自动开启safe_mode模式,导致任务失败

现象:DM在出现连接 driver: bad connection错误后,在重启task时候,报Duplicate entry,导致任务失败。(PS:出现bad connection错误,是因为TiDB设置了wait_timeout=600,而MySQL当时的更新频率很低,很长时间都没有数据写入,导致task的连接在空闲600s后被TiDB主动kill了,是符合预期的)
报错日志为:

按照文档的描述,在自动重试任务时候,默认应该会自动设置60s的safe_mode的,但是看表现并没有开启。
https://docs.pingcap.com/zh/tidb/stable/dm-safe-mode#自动开启

你看看配置呢

tso没有指定错吧

这算dm的缺陷吧,没有记录上次终断时间点实现断点续传啊

其实也有记录,不过是周期性记录到下游的TiDB里,并不实时写入,所以有时候会出错

你是怎么样发现 safe mode 没有开启的呢?有没有更多的日志方便排查?

日志里报了duplicate key,排查了一下记录确实是刚被插入的,只能是DM重复插入了两次。

有设置这个参数吗 safe-mode-duration

把之前数据删除,重新导入吧,感觉就是数据不一致的。重复插入了

不会实时写入 safe-mode 的结束位点,但是如果获取不到 safe-mode 退出位点的话会默认开启一段时间的 safe-mode 模式

safe-mode-duration

  • 安全模式依赖于通过主键或唯一索引来判断冲突。如果下游数据库对应的表没有主键或唯一索引,会导致 REPLACE 语句无法实现替换插入的目的。这种情况下,即使开启了安全模式,DM 将 INSERT 语句改写成 REPLACE 并执行后,依旧会向下游插入重复记录。

这个安全模式还有依赖的