首页/数据/数据工程与 ETL 速查/CDC 变更数据捕获:概念与实现方式
CDC 与同步53 条

CDC 变更数据捕获:概念与实现方式

CDC(Change Data Capture,变更数据捕获)指持续从数据库日志(binlog/redo/WAL)等来源抽出增量变更,与全量重拉相比只搬运变化的数据,适合数仓实时同步、缓存失效、搜索索引更新与微服务数据复制,通常与初始快照配合完成开荒。

CDC 是什么

CDC(Change Data Capture,变更数据捕获)指持续从数据源抽出增量变更,而不是周期性把整表重拉一遍。它不记录「表现在有什么」,而是记录「表发生了什么变化」——每条记录带操作类型与变更前后的值,因此能让下游以近似实时的速度跟随上游。

开荒阶段怎么做

接入新表必须同时解决两件事:一是初始快照,把存量数据搬过去;二是增量衔接,快照之后继续追变更且中间不留缺口。常见做法是先记录快照开始位置,再导数据,再从该位置持续消费,并保证快照期间产生的那部分变更会被补齐。

基本信息

中文名变更数据捕获(Change Data Capture)
输入数据库日志、触发器记录、时间戳轮询或全量比对
输出按主键排序的增删改事件流
常见工具Canal、Debezium、Flink CDC、Maxwell,云厂商 DTS 类服务
与本包关系本组聚焦日志解析型 CDC 及其同步落地

典型实现方式

方式原理优点局限
日志解析读 binlog / redo / WAL 等数据库日志对源库侵入小、延迟低需要日志权限与配套工具
触发器在表上建触发器记录变更实现直接、不依赖日志增加写入开销、维护对象多
时间戳轮询按 updated_at 字段增量查询实现简单、无需日志捕获不到删除、精度受字段维护影响
全量对比周期性全量比对差异不依赖日志开销大、延迟高,适合兜底校验

典型使用场景

  • 业务库实时同步到数仓,缩短从产生到可分析的时间间隔
  • 缓存一致性:变更事件触发缓存失效或刷新,避免应用侧双写
  • 搜索索引更新:把库表变更同步到检索引擎
  • 微服务数据共享:一个服务的库变更广播给多个消费者
  • 审计与合规留痕:完整记录每条记录的变更时间与内容

一条典型链路

一条典型链路
# 源端:数据库日志开启并配置为行级格式(MySQL 需 binlog_format=ROW)
MySQL binlog

# 解析层:CDC 工具以从库身份接入,持续拉取并解析为结构化事件
  → Canal / Debezium / Flink CDC

# 传输层:变更事件按表投递到主题,下游可各自订阅
  → Kafka 主题(一表一主题)

# 消费层:按 op 类型决定 upsert 或 delete,写入数仓 ODS / 检索 / 缓存 / 归档
  → 下游存储
CDC 不是「不需要全量」:新表接入仍需初始快照,只是快照之后靠增量跟随。省略快照会让历史数据永久缺失,而遗漏快照与增量的衔接点会造成一段无法补齐的数据缺口。
触发器方案在高写入场景会显著拖慢源库:每次写入都要额外执行触发器逻辑,选型前用真实写入压力做压测,不要在核心交易库上先试后评估。

易错点

  • 以为 CDC 不需要全量:新表接入仍要做初始快照,并且必须先确定快照与增量的衔接点,否则出现无法补齐的缺口
  • 在大批量写入的核心库使用触发器方案,源库写性能被明显拖慢,选型前未做压测
  • 把 CDC 当作批量同步工具:断线后位点丢失需要重新快照,缺少位点持久化与监控会导致静默缺数
  • 下游只处理 insert 不处理 delete,源库删除的记录在目标端永久残留,对账长期不平

数据来源与参考

  • Debezium 官方文档(Change data capture 概念)
  • MySQL 8.0 Reference Manual: The Binary Log
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌