使用DM从RDS中同步数据报for key 'PRIMARY'

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

  • 【TiDB 版本】:v4.0.0-rc
  • 【问题描述】:使用DM从RDS中同步数据报for key ‘PRIMARY’,单表导入,RDS的表中无重复数据

错误日志如下:

您好:

      1. 请查看556在下游是否已经存在此数据?
      2. 如果存在,上游这个数据会存在删除,再重新插入吗?
      3. DM是否有重启? 能否发送dm-worker日志,我们检查下历史信息,多谢

失败后,删除了库重新开启了新的任务,但恢复点好像不一样,请问如何才能完整干净的再做一次同步?

1.出现这种情况后查询下游不存在此数据
2.上游如果再插入主键也不一样
dm-worker-stderr.log (60.8 KB)

1、在下次出现主键冲突时,在不重启 task 的情况下,确认下该 key 在同步过程中的操作流程,下述方法可选择一种来进行确认:

1)使用 tidb 的 api 查询相应 key 的 mvcc 版本,确认下该 key 的操作流程

2)使用 tidb server 的物理 IP ,并且开启 general log:

2、请确认下,是否有业务操作造成的冲突,或者多个 task 任务间相互影响造成的冲突~

3、请确认下,在使用 DM 同步时,下游 TiDB 是否出现了同步延时的情况~

请问删除 dm_meta 库、同步库和 worker 的relay_log下的文件后是否是一次干净的同步?

1、可以尝试重置该任务后,重新进行同步。重置步骤请参考:

https://pingcap.com/docs-cn/tidb-data-migration/stable/faq/#如何重置数据同步任务

2、如果在重置后,仍然出现上述报错,请参照上述步骤进行排查,谢谢~

错误日志:

tidb的 mvcc

业务操作没有冲突,都是很早的老数据了;只有一个task; 出现错误后查询上游,只有一条数据;查询下游该表已经有此调数据。

1、根据提到上面的信息,load 出现冲突时下游 TiDB 的表中已经包含主键为 1653430 记录,那么使用 task 同步数据出现主键冲突可能是预期内的结果。

2、另外请检查下下游的数据是否有其他业务进行了写入呢?或者导出 sql 文件该表的该 id 是否是重复的?

1.使用的是重置整个同步任务,同步前已按照文档清除掉相关数据及库
2.重启task后进度涨了一些,但又很快出现了同样的情况,查询下游依然存在冲突的该条记录
3.该表上游只有一条数据
日志如下:

附:yssjcms-tb-task.yaml (46.6 KB)

请检查下,下游 tidb 是否出现过 oom 以及 dm-worker 的日志中是否出现了 connection time out 的相关信息

1.dm-worker 的日志中没有connection time out 的相关信息但出现了“invalid connection”。
2.tidb_stderr.log 没有 “fatal error: runtime: out of memory” 和 “cannot allocate memory”。

tidb:

dm-worker-stderr.log:

如果确认了下游没有业务修改该表的数据,并且出现主键冲突的时间点和 dm-worker 中出现报错的时间点比较吻合,那么出现上述报错的原因可能是:

因为在导入过程中 dm-worker 出现了 connection 相关的报错信息, loader 过程中会把 position 记录到下游 tidb_loader 库,写 position 和数据本身在一个事务里,同步写入下游。但如果实际数据已经写到下游,但出现 connection timeout 或者下游 oom,commit 后没有收到返回,这时 loader 判断可能会出现问题,会重试,而 loader 的 sql 是原生的 insert 及 update,这时可能就会出现主键冲突的报错了。

可以确认下游没有业务写入,现在这种情况有解决的办法吗?因为出现太频繁,用resume-task不现实。谢谢

1、咱们当前使用的 DM 版本是什么?

2、现在可以再开启下 general log 再次确认下这个 key 的操作路径吗?

3、dm woker 在出现连接报错时,与上游 Mysql 网络的联通性,丢包等正常吗?另外,有防火墙策略或者其他会回收链接的设置吗?

  1. DM版本为1.0.4
  2. general log已经开启了
  3. 内网联通性应该没问题,目前业务还没出现过网络问题,内网没有走防火墙

您好:

      1. 请问dm同步任务直连的某个tidb的tidb-server端,还是一个负载均衡的ip地址,例如HAproxy? 假如有HA看下是否配置了联系无效的tidb地址
      2. 请问上次是将下游表truncate清空了对吧。  relay log 的数据也清空了, checkpoint都清空了,完全重新导入的?
     3. 当前是invalid connect的报错, 还有primary重复的报错吗?  麻烦发一下清理后的dm-worker日志
  1. 同步任务是直连的tidb-server
  2. 下游直接把同步的库删除了,relay log也直接删除了,checkpoint没清空,但设置了remove-meta: true
  3. 有primary重复有invalid connect的报错

dm-worker.log (2.1 MB)
dm-worker-stderr.log (65 字节)

抱歉,您这里可能遇到一个 DM 1.0.4 版本 loader 阶段主键冲突报错的一个 BUG,这里提供了一个 hotfix 来跳过这个报错,请您替换为下述版本后,重置 DM 同步任务,重新开始同步。如果仍然遇到相关报错,请继续跟帖,感谢~~~

下载地址:

DM v1.0.4-hotfix: http://download.pingcap.org/dm-v1.0.4-hotfix-linux-amd64.tar.gz

DM-Ansible v1.0.4-hotfix: http://download.pingcap.org/dm-ansible-v1.0.4-hotfix.tar.gz

可以在原版本上直接升级吗?