一、背景
新建了一个cdc同步的任务,上游为tidb,下游为mysql,但是发现一些新建的表并不能同步到下游mysql中
二、排查
1.查看日志
# 内容如下这表明这个表不满足同步条件
tables are not eligible to replicate
2.cdc同步的限制
TiCDC 只能同步至少存在一个有效索引的表,有效索引的定义如下:
- 主键 (PRIMARY KEY) 为有效索引。
- 同时满足下列条件的唯一索引 (UNIQUE INDEX) 为有效索引:
- 索引中每一列在表结构中明确定义非空 (NOT NULL)。
- 索引中不存在虚拟生成列 (VIRTUAL GENERATED COLUMNS)。
三、解决办法
方案一、创建满足cdc同步条件的表
方案二、更改cdc为可以同步无有效索引的表
1.停止任务
tiup ctl:v4.0.15 cdc changefeed pause --pd=http://pd_ip:pd_port --changefeed-id=simple-replication-task
2.修改cdc任务配置文件
vim cdc.yaml
# 添加如下配置
enable-old-value = true
force-replicate = true
3.修改配置
tiup ctl:v4.0.15 cdc changefeed update --pd=http://pd_ip:pd_port --config=./cdc.yaml --changefeed-id=simple-replication-task
4.启动cdc任务
tiup ctl:v4.0.15 cdc changefeed resume --pd=http://pd_ip:pd_port --changefeed-id=simple-replication-task
5.注意点
enable-old-value v4.0.5开始支持
force-replicate v4.0.8开始支持
对于没有有效索引的表,INSERT 和 REPLACE 等操作不具备可重入性,因此会有数据冗余的风险。TiCDC 在同步过程中只保证数据至少分发一次,
因此开启该特性同步没有有效索引的表,一定会导致数据冗余出现。如果不能接受数据冗余,建议增加有效索引,譬如增加具有 AUTO RANDOM 属性的主键列。
官网文档: 文档地址