Tidb 批插入数据 做cdc时 只获取到了一条数据,请问需要怎么处理或者需要设置哪些参数?

【TiDB 使用环境】生产环境 /测试/ Poc
【TiDB 版本】8.5.2
表结构:
CREATE TABLE test.tidb_test_004 (
code varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
name varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
rq date NULL DEFAULT NULL,
xz decimal(10, 0) NULL DEFAULT NULL,
bz varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
PRIMARY KEY (code) USING BTREE
) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;

批插入数据在做cdc时数据读快照或者流时只获取到最后插入的一条数据 比如:
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES
(‘e000000001’, ‘张三’, ‘2023-01-01’, 100, ‘备注信息1’),
(‘e000000002’, ‘张三’, ‘2023-01-01’, 100, ‘备注信息1’),
(‘e000000003’, ‘张三’, ‘2023-01-01’, 100, ‘备注信息1’),
(‘e000000004’, ‘张三’, ‘2023-01-01’, 100, ‘备注信息1’);
单条插入数据在做cdc时数据能全部获取比如:
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000001’, ‘张三’, ‘2023-01-01’, 100, ‘备注信息1’);
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000002’, ‘李四’, ‘2023-01-02’, 200, ‘备注信息2’);
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000003’, ‘王五’, ‘2023-01-03’, 300, ‘备注信息3’);
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000004’, ‘赵六’, ‘2023-01-04’, 400, ‘备注信息4’);
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000005’, ‘孙七’, ‘2023-01-05’, 500, ‘备注信息5’);
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000006’, ‘周八’, ‘2023-01-06’, 600, ‘备注信息6’);
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000007’, ‘吴九’, ‘2023-01-07’, 700, ‘备注信息7’);
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000008’, ‘郑十’, ‘2023-01-08’, 800, ‘备注信息8’);
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000009’, ‘钱十一’, ‘2023-01-09’, 900, ‘备注信息9’);
INSERT INTO test.tidb_test_004 (code, name, rq, xz, bz) VALUES (‘d000000010’, ‘孙十二’, ‘2023-01-10’, 1000, ‘备注信息10’);

下游是什么,cdc的配置是什么样,正常不应该有这个问题

env {
parallelism = 2
“job.mode” = “STREAMING”
checkpoint.interval = 5000
}
source {
TiDB-CDC {
base-url=“jdbc:mysql://10.126.50.147:4000/test”
username=*******
password=“*******”
database-name=test
table-name=“tidb_test_004”
“startup.mode”=initial
“plugin_output”=“source_data”
pd-addresses=“10.126.50.147:2379”
batch-size-per-scan = 1
tikv.grpc.timeout_in_ms = 30000
tikv.grpc.scan_timeout_in_ms = 30000
tikv.batch_get_concurrency = 1
tikv.batch_scan_concurrency = 1
}
}
transform {
Sql {
“plugin_input”=“source_data”
“plugin_output”=“trans_data”
query=“select code as code ,name as name ,rq as rq ,xz as xz ,bz as bz from source_data”
}
}
sink {
Paimon {
“paimon.table.primary-keys”=code
database=db102
“plugin_input”=“trans_data”
“paimon.hadoop.conf” {
“fs.s3a.access.key”= *********
“fs.s3a.aws.credentials.provider”=“org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider”
“fs.s3a.path.style.access”=“true”
“fs.s3a.secret.key”= **********
“fs.s3a.endpoint”=“http://10.0.23.159:9000
}
“data_save_mode”=“APPEND_DATA”
warehouse=“s3a://103/”
table=“tidb_test_004cdc”
}
}
用的seatunnel跑tidb-cdc任务,断点日志查看tikv 中的Kvrpcpb.KvPair record, Cdcpb.Event.Row row 中只有一条数据

从cdc测直接解析出来是几条数据,应该也是多条,而不是一条吧

大概率是触发了safe-mode保护, safe-mode是ticdc的一个保护机制,用于防止因重试导致的重复写入,当你批量插入多条数据时,它们属于同一个事务, 如果 sink 端逻辑错误地认为这些是同一行,那就会被覆盖。

什么是safe-mode保护,有官方说明链接吗?深入看看

我是读取tidb的数据 读出来的数据就一条数据了(tidb表向paimon表做cdc,在tidb-cdc任务正在执行过程中时候,向tidb表批写数据),sink 端的表跟tidb表的字段 主键是一样的。
这个看日志哪些关键信息能确定是触发了safe-mode保护。
谢谢!

safemode是保证相同主键或者唯一性的数据重复操作的吧

你的sink端也是TiDB吧(paimon表所在),批量写数据主键不冲突,为啥触发了safe-mode呢?
你定位到的关键日志信息是啥,方便发出来学习下么

都用这么高的版本了

sink端是paimon表 在日志中获取到TiDB那边插入数据的时候就看到一条数据了

cdc 原生支持这个 sink 么?是不是用的三方的什么软件。。。

你这应该是seatennel的bug,跟tidb没关系 tidb自己的组件是ticdc

seatennel 是使用的tikv-client包来读取的快照和流