升级Debezium Postgres Connector至v2.0.1引发Schema兼容性问题
Debezium 1.9.3 升级至 2.0.1 后 Schema 兼容性问题解决方案
Debezium 2.0.x 版本对内部 Schema 定义做了集中化、规范化重构(对应 DBZ-4365、DBZ-5044),导致升级后生成的 Schema 与 1.9.3 版本注册的旧 Schema 不兼容,触发 Schema Registry 的兼容性校验报错。而事件扁平化模式下,连接器输出简化后的业务数据结构,不受 Debezium 内部 Schema 变更影响,因此无报错。以下是具体解决方案:
解决方案1:全量重新同步数据(推荐用于允许数据重导的场景)
- 停止运行中的 1.9.3 版本 Debezium 连接器
- 通过 Schema Registry API 删除对应 CDC 主题的所有 Schema subject:
curl -X DELETE http://<schema-registry-host>:<port>/subjects/{subject-name} - 部署并启动 2.0.1 版本的 Debezium 连接器,从头开始全量同步数据
- 新连接器会注册符合 2.0.x 规范的 Schema,旧 Schema 已清理,不会触发兼容性校验
解决方案2:临时调整 Schema Registry 兼容性级别(过渡方案)
- 将对应 subject 的兼容性级别临时修改为
NONE(关闭兼容性校验):curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \ --data '{"compatibility": "NONE"}' \ http://<schema-registry-host>:<port>/config/<subject-name> - 启动 2.0.1 版本连接器,待新 Schema 成功注册后,再将兼容性级别改回原有设置(如
BACKWARD) - 注意:此方法跳过兼容性校验,需确保下游消费者能兼容新旧 Schema 结构
解决方案3:启用事件扁平化模式(长期稳定方案)
- 在连接器配置中添加事件扁平化转换,直接输出业务数据而非 CDC 原始结构:
transforms=unwrap transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState transforms.unwrap.drop.tombstones=false # 可选,根据业务需求保留墓碑消息 - 扁平化后的 Schema 仅包含业务表字段,不受 Debezium 内部 Schema 变更影响,从根本上避免此类兼容性问题
解决方案4:手动兼容新旧 Schema(适合需保留历史数据的场景)
- 导出 1.9.3 版本注册的旧 Schema 和 2.0.1 版本生成的新 Schema
- 对比两者差异,修改新 Schema 使其满足 Schema Registry 的兼容性规则(如将新增字段标记为可选、添加默认值等)
- 通过 Schema Registry API 手动注册修改后的兼容 Schema
- 启动 2.0.1 版本连接器,此时新 Schema 会被识别为兼容版本,顺利通过校验
内容的提问来源于stack exchange,提问作者Rishabh Agarwal
相关产品推荐
相关产品推荐

