dm同步时丢失更新

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

  • 【TiDB 版本】:v3.0.5 dm版本
Release Version: v1.0.0-alpha-69-g5134ad1
Git Commit Hash: 5134ad19fbf6c57da0c7af548f5ca2a890bddbe4
Git Branch: master
UTC Build Time: 2019-04-29 09:36:59
Go Version: go version go1.12 linux/amd64
  • 【问题描述】: 通过使用DM,从mysql同步数据到tidb,期间tidb应该是发生了异常,导致有两具update丢失更新:

dm日志异常执行抛出来的sql已经正常执行,就是payment_system.pay_order的id为676880002,但是这个id insert后有update语句,没有正常执行。导致tidb最终数据与上游mysql数据不一致。 676880002 这条记录变更时间点:

#200212  8:42:06

update
#200212  8:43:25   @13=1
#200212  8:43:28   @13=3

dm日志如下: dm.log (45.2 KB)

查看 dm.log 日志看到涉及到 id 为 676880002 的语句在更新时出现了 error,具体报错信息为:invalid connection。可以参考文档 https://pingcap.com/docs-cn/stable/reference/tools/data-migration/troubleshoot/error-handling/#同步任务中断并包含-invalid-connection-错误 来处理。

异常后,dm自动恢复了,但是最终有数据丢失。

#200212  8:43:25   @13=1
#200212  8:43:28   @13=3

如上两具binlog并没有同步过去

出现 invalid connection 报错时可能会丢数据(发送一部分数据到下游,然后链接中断),具体原因可以看上面文档,如果错误中仅包含 invalid connection 类型的错误且当前处于增量复制阶段,则 DM 会自动进行重试。在 DM 恢复正常之后,是不会再产生丢数据问题。在报错阶段出现的数据问题可能需要手动补。

连接也是dm自动重连恢复的,还是存在了丢失数据。报错阶段出现的那几个异常的sql,我确认了是正常同步了,异常sql之后的两个update确实是没有同步到tidb,不知道是什么导致的。日志中也没有说明跳过了。我看异常后,rollback到checkpoint的点,是在丢失的数据之前的, 不知道为什么还丢失更新了。

这个版本不太稳定,可能会遇到一些问题,推荐使用 DM ga 版本。

好的,那我尝试升级下

先升级在同步看下是否有同样问题,欢迎提问。

现在使用就有风险了,扫了下之前的日志,有很多次报了invalid connection 异常的,基本上都是自己恢复的。不确认是否有丢失数据的情况。:sweat_smile:

换稳定的 GA 版本:grinning:

目前稳定版本是: v1.0.3吧

GA 之后相对都稳定些,可以用 1.0.3 。

好的,感谢

:+1:

已经升级了

mysql没有使用gtid的情况下,如果上游发生变化 ,重启后会从新的上游最老的binlog开始同步?这个不能中之前的checkpoint的binlog 点同步吗?

再问一个问题,没有gtid的情况下,如何安全切换上游mysql。 改dm_meta里表的为global的mysqlbin位置点吗?

relay_log目前变化规则否是start-task后,会自动生成: 上游uuid.当前序号+1 是吗?

新问题建议重新开个帖子 ,辛苦。