使用 TiCDC 把数据同步至下游 MySQL 时,部分语句逻辑会发生变化,导致下游拿到的 SQL 和上游不一致

Bug 反馈
清晰准确地描述您发现的问题,提供任何可能复现问题的步骤有助于研发同学及时处理问题
【 Bug 的影响】

使用 TiCDC 把数据同步至下游 MySQL 时,部分语句逻辑会发生变化(update 变为 delete+insert),导致下游拿到的 SQL 和上游不一致。

【可能的问题复现步骤】

操作情况:

create table sync_test (id int primary key auto_increment,info varchar(30))

insert into sync_test (info) values (‘tom’);commit;

image.png

tidb 上执行一条 update 语句:

update sync_test set info = ‘jerry’ where id = 1;commit;

然后在下游 MySQL 的 binlog 中看到:

【看到的非预期行为】

SQL 逻辑发生变更

【期望看到的行为】

TiDB 段执行的 update 语句,到了下游 MySQL 还是以 update 的形式出现,而不是转换成 delete + insert 或者 replace。

【相关组件及具体版本】
TiDB v5.0.0.0
TiCDC v5.0.0

【其他背景信息或者截图】
如集群拓扑,系统和内核版本,应用 app 信息等;如果问题跟 SQL 有关,请提供 SQL 语句和相关表的 Schema 信息;如果节点日志存在关键报错,请提供相关节点的日志内容或文件;如果一些业务敏感信息不便提供,请留下联系方式,我们与您私下沟通。

简单的业务架构如下:

image

这个并不是产品缺陷,并不会导致数据不一致,暂时不支持对已有 changefeed 在线修改 safe mode 是产品已知问题,可如果希望支持,可以就这一点提个产品需求

我的需求其实就是希望上游 SQL 是怎么样的,然后通过 TICDC 同步到 MySQL 还是这样的。

因为我们还要去下游 MySQL 里取 binlog,如果拿不到一样的 SQL,会导致我们最后数据汇总出错。

可以在测试环境开一下 enable-old-value = true 并在创建 changefeed 同时设置 safe-mode 为 false,比如 --sink-uri=“mysql://root@${DOWN_TIDB_HOST}:${DOWN_TIDB_PORT}/?safe-mode=false”

简单测了下,update 同步过来了。

之前看文档以为开启 old value 后会把 update 转为 replace into 语句,

是我肤浅了,谢谢老哥回答!