tidb同步数据至下游mysql时drainer报错error="Error 1062: Duplicate entry

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

sorry,

请问同步链路是 tidb(v309)-> tidb binlog(v309) -> mysql(?)
tidb:
select tidb_version(); select now(); show variables like '%time_zone'; system date

mysql:
select version(); select now(); show variables like '%time_zone'; system date

MYSQL%E5%8F%82%E6%95%B0

同步链路是 tidb(v309)-> tidb binlog(v309) → mysql

感谢你的反馈,能否提供下完整的 pump 和 drainer log 看下?
时间区间包括这张图的时间即可

drainer.log.txt (73.5 KB) pump1.log.txt (11.2 KB) pump2.log.txt (11.2 KB) pump3.log.txt (11.3 KB)

该问题在11月30号下午集群底层的存储hang住后出现的,之前一直没有问题

非常感谢你的反馈
问题分析:

重复的数据主键不冲突,但是唯一索引冲突。

drainer 在并发到下游的时候,会根据第一个唯一的 key(包括主键) 的 hash 作为分发的条件。由于两条记录的主键不同,所以并发执行的时候,不能保证严格的顺序。

结论是

  1. 目前的 drainer 并发模式不能很好的支持这类同步。
  2. 用户可以通过设置 worker-count = 1 避免这段并发来绕过这个问题。
  3. 升级到 ticdc v4.0.6(ticdc GA 之后的版本)建议最新版本,解决此问题。

我重新做了好几次同步 但是发现下游每天新增的数据要比tidb的少很多,但是binlog除了偶尔报一次主键冲突的错误,其他一切看起来都正常,看看监控也没有延迟

设置 worker-count = 1 后还是遇到该问题

sorry,

这部分结论有点问题,应该是误判了。

从此楼我们重新看下着问题

@Hacker_1bOJKx43
你好,
请帮忙确认以下信息:

  1. 用户没有改动过 causality 相关配置。
  2. 用 admin check table 结果辛苦反馈下。

该问题在11月30号下午集群底层的存储hang住后出现的,因为怀疑是部分update的binlog日志未到达drainer,所以重新部署了pump集群并把worker-count设置为1,然后就修复了这个问题。
但是之前设置worker-count设置为1时,也同时修改了中控机上的drainer_mysql.toml文件和drainer服务器上的drainer.toml文件,感觉修复的主要原因是重新部署了pump.

OK,

这两个问题可以回复下

@Hacker_1bOJKx43 hello,请帮忙看下上面的问题

如果有困难,可以提供下完整的 pump log 我们看下

pump_1.zip (5.5 MB) [quote=“东北大胖子, post:14, topic:64052”]
admin check table
[/quote]

pump_2.zip (5.3 MB) pum_3.zip (5.1 MB)
您好,这是故障前后的日志

[quote=“Hacker_1bOJKx43, post:16, topic:64052”]

这个没太看懂,就是在业务低峰期执行下 admin check table tble-name; tble-name 为上下游数据量不太一样的表即可(譬如上面截图中 t_user )

admin_check_user
admin check table t_user的结果为空

非常感谢你的反馈,有进展我们会及时更新帖子