TiCDC在下游新添加分区时,存在数据不同步,且cdc不报错的情况

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
功能性测试

【概述】 场景 + 问题概述
上游tidb表结构没有非唯一索引和非空约束。
下游mysql/tidb表结构存在唯一索引和非空约束。
先在下游表结构添加分区,再在上游表结构添加分区。ticdc的数据不能正常同步,无任何报错

【希望获得的结果】:
TICDC能够正常同步数据,或者生成报错告警信息。

tidb版本:v5.0.3
mysql版本:v5.7.26
ticdc版本:v5.0.3
复现例子:

复现步骤:
1.建立下游表结构
create table a(
	id int not null ,
	LogTime datetime not null,
	unique key idx (id,LogTime)
)PARTITION BY RANGE ( TO_DAYS(`LogTime`) ) (
	PARTITION `p202101` VALUES LESS THAN (738187),
  PARTITION `p202102` VALUES LESS THAN (738215)
);

2.建立上游的表结构,
create table a(
	id int,
	LogTime datetime,
	key idx (id)
)PARTITION BY RANGE ( TO_DAYS(`LogTime`) ) (
	PARTITION `p202101` VALUES LESS THAN (738187),
  PARTITION `p202102` VALUES LESS THAN (738215)
);

3.上游执行插入操作,能正常同步到下游
MySQL [xx]> insert into a values(1,'2021-1-1');
Query OK, 1 row affected (0.03 sec)
MySQL [xx]> insert into a values(1,'2021-2-1');
Query OK, 1 row affected (0.01 sec)
MySQL [xx]> 

4.下游查询数据,能正常查到数据
mysql> select * from a;
+----+---------------------+
| id | LogTime             |
+----+---------------------+
|  1 | 2021-01-01 00:00:00 |
|  1 | 2021-02-01 00:00:00 |
+----+---------------------+
2 rows in set (0.00 sec)

mysql> 

5.在下游表结构中增加新的分区
alter table a add PARTITION (  PARTITION `p20210401` VALUES LESS THAN (738246));

6.在上游表结构中增加新的分区
alter table a add PARTITION (  PARTITION `p20210401` VALUES LESS THAN (738246));

7.在上游插入数据。下游不能查到新插入的数据。
MySQL [xx]> insert into a values(1,'2021-3-1');
Query OK, 1 row affected (0.01 sec)
MySQL [xx]> insert into a values(1,'2020-3-1');

cdc 的配置

# 指定配置文件中涉及的库名、表名是否为大小写敏感
# 该配置会同时影响 filter 和 sink 相关配置,默认为 true
case-sensitive = true

# 是否输出 old value,从 v4.0.5 开始支持,从 v5.0 开始默认为 true
enable-old-value = true
force-replicate = true

[filter]
# 过滤器规则
rules = ['xx.*']

[mounter]
# mounter 线程数,用于解码 TiKV 输出的数据
worker-num = 8

【附件】

  • 相关日志、配置文件、Grafana 监控(https://metricstool.pingcap.com/)
  • TiUP Cluster Display 信息
  • TiUP CLuster Edit config 信息
  • TiDB-Overview 监控
  • 对应模块的 Grafana 监控(如有 BR、TiDB-binlog、TiCDC 等)
  • 对应模块日志(包含问题前后 1 小时日志)

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

可以检查下 ticdc 的日志,是否有报错信息?
另外确认下 在添加新分区之前,ticdc 是可以正常同步的对吧?

1)就一个Error 1517: Duplicate partition name告警。其他都是info消息
2)在添加分区之前,是可以正常同步的。
我这边也测试过:先在下游添加分区,再在上游添加分区。分区名不同时。能够正常报错。但分区名相同时,无任何报错信息,上游dml不能正常复制,例子是可以复现的

这样操作的目的是什么?

我们这边有个归档库。主要用于存放老的日志。部署归档库时,添加表分区的自动作业忘记取消了。后来发现归档库的数据库少了,但是cdc无报错,grafana中cdc显示无lag信息,通过排查和做实验发现是ddl引起的。后面取消了归档库的分区自动作业,目前cdc运行是正常的。

复现的时候,需要注意上游表结构无唯一索引。下游表结构有唯一索引

你这操作方式有问题的。建议你使用时在上游添加 DDL 操作后,通过 CDC 将 DDL 同步到下游。这是比较正确的方式。

我知道操作存在问题。
我的疑问是:ticdc也应该报出一些告警。或者停止复制。不应该没有任何告警,导致数据丢失。

ticdc 的同步状态是怎样的,麻烦提供一下。

分区表,在没有唯一所有或者主键的时候。使用enable-old-value = true force-replicate = true,在添加分区的时候,ticdc复制不会出现告警,但是数据不会复制
复现步骤:
添加cdc复制。

# cdc cli changefeed create --pd=http://xx.xx.xx.xx:2379 --sink-uri="mysql://user:pwd@xx.xx.xx.xx:3306/?worker-count=2&max-txn-row=32" --changefeed-id="xxxx" --sort-engine="unified"  --config=changefeed_mysql.toml
# cat changefeed_mysql.toml
case-sensitive = true
enable-old-value = true
force-replicate = true

[filter]
# 过滤器规则
rules = ['xx.*']
1.建立上游的表结构
create table a(
	id int,
	LogTime datetime,
	key idx (id)
)PARTITION BY RANGE ( TO_DAYS(`LogTime`) ) (
	PARTITION `p202101` VALUES LESS THAN (738187),
  PARTITION `p202102` VALUES LESS THAN (738215)
);
2.添加分区。
alter table a add PARTITION (  PARTITION `p20210401` VALUES LESS THAN (738246));

3.上游执行插入操作,下游不能查到数据
MySQL [xx]> insert into a values(1,'2021-1-1');
Query OK, 1 row affected (0.03 sec)
MySQL [xx]> insert into a values(1,'2021-2-1');
Query OK, 1 row affected (0.01 sec)
MySQL [xx]> 

cdc.log (84.8 KB)
changefeed状态

[root@xxx test]# cdc cli changefeed list
[
  {
    "id": "xxxx",
    "summary": {
      "state": "normal",
      "tso": 427740249734774785,
      "checkpoint": "2021-09-15 17:52:41.061",
      "error": null
    }
  }
]
[root@xxx test]# 

从日志里来看,cdc 的版本和集群版本不一致呀 ? 麻烦版本一致的情况下使用。

这是一个bug,见 https://github.com/pingcap/ticdc/issues/2834

:+1:t2::+1:t2::+1:t2:

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