通过 TiCDC 把数据同步至下游 MySQL,update 语句会被拆成 delete+insert

TiDB 版本 V5.0.0.0

情况描述:

操作情况:

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

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

tidb 上执行一条 update 语句:

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

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

现在主要有三个问题:

  1. update 语句转为 delete + insert 这步是在 TiDB 还是在 TiCDC 发生的?
  2. 同步方式能否改为类似于 MySQL row 模式的同步方式?
  3. 因为我们下游 canal 还是想拿到原来的 update 语句,有没有其他方式去实现同步?
1 个赞

这个是在 TiCDC 内部转换的,可以开启 old value,在非 safe mode 模式下按照原来的 update 同步( https://github.com/pingcap/ticdc/pull/955

不过由于目前 ticdc 默认使用 safe mode 模式且暂不支持修改,所以开启 old value 后上游的 update 会被转换为 replace into( https://docs.pingcap.com/zh/tidb/stable/troubleshoot-ticdc#使用-ticdc-创建同步任务时将-enable-old-value-设置为-true-后上游的-insertupdate-语句经-ticdc-同步到下游后变为-replace-into

tidb-binlog 有同样设置,可以考虑通过 tidb binlog 同步并关闭 safe mode https://docs.pingcap.com/zh/tidb/stable/tidb-binlog-glossary#safe-mode

Ticdc 改不了 safe mode,这个之后会支持吗?现在使用下来感觉 ticdc 使用起来还是很好的,还是希望能沿用 ticdc 的同步方案。

tidb-binlog 如果关闭 safe mode,update 和 insert 都会变转成 replace into 是吧,这样其实也不满足我们的需求。官方推荐的同步工具,是不是都是这个逻辑。。

目前不支持修改 safe mode 指的是创建 changefeed 后无法修改,需要在创建时就设置好,如果要设置 safe-mode 需要删除之前的 changfeed 并重建

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。