首页/数据/数据工程与 ETL 速查/Debezium schema 历史主题
CDC 与同步53 条

Debezium schema 历史主题

Debezium 用 schema 历史主题记录数据源的 DDL 演进(建表、加列、改列),解析 binlog 时按历史结构还原行的字段布局。该主题(schema.history.internal.kafka.topic)必须可持久化并采用 compacted 清理策略;丢失后 DDL 之后的解析会错位。

schema 历史主题的作用

Debezium 用 schema 历史主题记录数据源的 DDL 演进(建表、加列、改列),解析 binlog 时按历史结构还原每一行的字段布局。原因很直接:binlog 里的行事件只带列值、不带列名,解析器必须知道「这个时间点的表结构长什么样」。所以这个主题必须可持久化,并采用 compacted 清理策略保留历史版本;一旦丢失,DDL 之后的事件就会按错误的列布局解析。

基本信息

存什么数据源的 DDL 变更序列与表结构版本
为什么需要行镜像按当时的列布局解析,需要结构历史对齐
配置项schema.history.internal.kafka.topic(2.x 命名)
清理策略compacted,由 Connect 内部主题机制维护

典型使用场景

  • 首次接入:为每个数据源规划独立的历史主题名
  • 结构演进:加列、改类型后确认历史主题已记录新版本
  • 故障恢复:确认历史主题完整,避免解析列错位
  • 集群迁移:内部主题要一并迁移,不能只迁业务主题
  • 容量治理:评估内部主题的保留与清理策略

连接器中的相关配置

连接器中的相关配置
# 连接器配置片段
schema.history.internal.kafka.bootstrap.servers=kafka1:9092
schema.history.internal.kafka.topic=schema-changes.orderdb   # 每个数据源一个主题

内部主题与职责

主题作用丢失后果
schema 历史主题记录 DDL 与结构版本DDL 之后的事件解析列错位
connect-offsets记录连接器消费位点位点丢失,需按启动模式重新消费
connect-configs保存连接器配置配置丢失,需要重新提交
connect-status保存连接器与任务状态状态信息丢失,监控口径不连续
清理 Kafka 内部主题(connect-offsets、connect-configs、schema 历史)前,先停掉连接器并评估重建成本:内部主题不是业务数据,删了不一定能重来。
换主题名等于换一份历史:新主题里没有旧结构的记录,如果不配套做一次快照重建,新旧结构的历史会接不上,解析从切换点开始就可能错位。
一个数据源配一个历史主题是最省心的做法;把多个库的表结构记进同一个主题,虽然运行上没问题,但排查时无法按数据源隔离,也更容易在高频 DDL 场景下混淆版本顺序。

易错点

  • 清理集群时把 schema 历史主题当业务数据删掉,重启后事件解析列错位
  • 换主题名后未做快照重建,新旧结构历史接不上
  • 历史主题副本数设为 1,Broker 故障后结构记录一起丢失
  • 多人维护时各自新建连接器却复用同一主题名,不同数据源的 DDL 混在一起

数据来源与参考

  • Debezium 官方文档(schema history topic 与 DDL 处理)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌