主从TIDB集群通过CDC同步,主库改大表结构导致CDC同步异常

【TiDB 使用环境】生产环境 /测试/ Poc
【TiDB 版本】7.5.3
【操作系统】centos7.9
【部署方式】
【集群数据量】
【集群节点数】
【问题复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
问题: 主从集群通过CDC同步,主库改大表结构导致CDC同步异常
1)在主库改大表(3亿数据),主库耗费约2小时
ALTER TABLE archive_real_time_detail MODIFY COLUMN policy_interests VARCHAR(100) NOT NULL DEFAULT ‘-1’ COMMENT ‘政策关注1:厂方政策、2:店端政策’, MODIFY COLUMN customer_concerns VARCHAR(255) NOT NULL DEFAULT ‘-1’ COMMENT ‘客户关注点 1:外饰 2内饰’;

2)发现CDC同步中断
2.1)CDC同错
cdc cli changefeed query -s -c jxsclusterlfTojxsyz
“namespace”: “default”,
“id”: “jxsclusterlfTojxsyz”,
“state”: “failed”,
“checkpoint_tso”: 461489208569102374,
“checkpoint_time”: “2025-10-14 19:33:42.044”,
“error”: {
“time”: “2025-10-14T21:59:06.707997094+08:00”,
“addr”: “10.68.128.218:8300”,
“code”: “CDC:ErrChangefeedUnretryable”,
“message”: “[CDC:ErrReachMaxTry]reach maximum try: 20, error: invalid connection: invalid connection”
}

3)检查发现从库上show processslist有很多条相同的alert table SQL .
当时执行admin show ddl jobs ; 也确实有多条相同alert sql,有些在队列中。

问:1)问题原因及如何解决?
** 2)为什么从库上会有很多alert SQL呢?**

【复制黏贴 ERROR 报错的日志】
【其他附件:截图/日志/监控】

主库上ddl情况:

CDC同步错误:

问题当时从库状态:

CDC日志:
grep -i “ddl.*error” cdc.log.20251014
[2025/10/14 20:50:22.817 +08:00] [INFO] [shared_stream.go:226] [“event feed receive from grpc stream failed”] [namespace=default] [changefeed=jxsclusterlfTojxsyz_processor_ddl_puller] [streamID=23] [storeID=7] [addr=10.68.129.23:20161] [code=Canceled] [error=“rpc error: code = Canceled desc = context canceled”]

https://docs.pingcap.com/zh/tidb/stable/ticdc-ddl/#ddl-同步注意事项

https://docs.pingcap.com/zh/tidb/v7.5/ticdc-changefeed-config/#ticdc-changefeed-配置文件说明

Syncpoint 功能对齐上下游 snapshot 的时间间隔
配置格式为 h m s,例如 “1h30m30s”
默认值为 10m,最小值为 30s
注意:该参数只有当下游为 TiDB 时,才会生效。
sync-point-interval = “5m”
Syncpoint 功能在下游表中保存的数据的时长,超过这个时间的数据会被清理
配置格式为 h m s,例如 “24h30m30s”
默认值为 24h
注意:该参数只有当下游为 TiDB 时,才会生效。
sync-point-retention = “1”

日志情况:
CDC日志:
grep -i “ddl.*error” cdc.log.20251014
[2025/10/14 20:50:22.817 +08:00] [INFO] [shared_stream.go:226] [“event feed receive from grpc stream failed”] [namespace=default] [changefeed=jxsclusterlfTojxsyz_processor_ddl_puller] [streamID=23] [storeID=7] [addr=10.68.129.23:20161] [code=Canceled] [error=“rpc error: code = Canceled desc = context canceled”]

AI给出的说明: 是否正确? ?
1)重复 DDL 问题原因
可能原因:
// 可能的异常场景
func (s *Scheduler) handleDDLFailure() {
// 1. DDL 执行超时或失败
// 2. TiCDC 重试机制触发
// 3. 多个 TiCDC 实例同时尝试执行相同的 DDL
// 4. 下游出现大量重复的 ALTER TABLE
}

2)大表 DDL 同步优化建议:

针对大表 DDL 的配置优化

[sync]
增加 DDL 同步超时时间
ddl-sync-timeout = “60m”

[scheduler]
限制 DDL 并发,避免多个 DDL 同时执行
ddl-dispatch-concurrency = 1

[sink]
增加下游执行超时
exec-timeout = “30m”

  1. 你看下这里的 checkpoint time 是不是和上游 ddl 完成执行的时间是一样的,你这里应该是 ddl 执行时间过长导致 mysql 断开链接,想办法绕过这条 ddl,手动在 下游执行吧https://docs.pingcap.com/zh/tidb/stable/troubleshoot-ticdc/#当-changefeed-的下游为类-mysql-数据库时ticdc-执行了一个耗时较长的-ddl-语句阻塞了所有其他-changefeed应该怎样处理
  2. 因为 cdc 内部有重试机制,执行不成功会进行多次尝试

https://github.com/pingcap/tiflow/issues/10682 另外一个方法就是调大 mysql 的 read-timeout 参数

  • 暂停当前 CDC 同步任务:cdc cli changefeed pause -c jxsclusterlfTojxsyz
  • 清理从库堆积的冗余 DDL 任务:通过admin show ddl jobs找到所有相同的ALTER TABLE任务,对处于 “running” 或 “queued” 状态的冗余任务执行admin cancel ddl job <job_id>
  • 等待主库 DDL 完全完成(通过admin show ddl jobs确认主库对应 DDL 状态为 “done”)。
  • 重启 CDC 同步任务:cdc cli changefeed resume -c jxsclusterlfTojxsyz,并指定从主库 DDL 完成后的 TSO 开始同步(避免重复同步历史 DDL)。

建议先手动在从库执行该ddl并重建changefeed,或者跳过该事件继续同步。

看下最后是怎么解决的.