Change Data Capture(CDC) 是 SQL Server 提供的一种变更数据捕获机制,它会记录数据库表中 INSERT
、UPDATE
、DELETE
操作,并将变更内容写入系统维护的 CDC 表中。
相比传统轮询或触发器,CDC 提供:
非侵入式设计(不修改原始表结构)
低延迟变更记录
易于对接 Kafka、ETL、SeaTunnel 等下游组件
组件 | 说明 |
---|---|
cdc.dbo_customer_CT | 系统自动创建的变更表,存储变更数据 |
Capture Job | SQL Agent 任务,定期扫描事务日志并解析出变更 |
Cleanup Job | 定期清理过期的 CDC 数据 |
LSN(Log Sequence Number) | 每条变更记录的位点标识,支持断点续传 |
-- 1. 为数据库启用 CDCEXEC sys.sp_cdc_enable_db;-- 2. 为表启用 CDCEXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'customer', @role_name = NULL, @supports_net_changes = 0;
启用后,SQL Server 会自动创建以下结构:
cdc.change_tables
:变更表(每张原表对应一个)
cdc.lsn_time_mapping
:LSN 与时间戳映射表
SQL Agent 中的 cdc.<DBName>_capture
和 cdc.<DBName>_cleanup
任务
SeaTunnel 通过 CDC connector 读取 SQL Server 的变更表(CT 表)并转换为统一格式。
source { SqlServer-CDC { plugin_output = "customers" username = "sa" password = "Y.sa123456" startup.mode="initial" database-names = ["column_type_test"] table-names = ["column_type_test.dbo.full_types"] base-url = "jdbc:sqlserver://localhost:1433;databaseName=column_type_test" }}
以 customer
表为例,启用 CDC 后生成的变更表如下:
SELECT * FROM cdc.dbo_customer_CT;
字段包括:
字段 | 说明 |
---|---|
__$start_lsn | 起始日志序号 |
__$operation | 操作类型(1=DELETE, 2=INSERT, 3/4=UPDATE) |
__$seqval | 序列化标识 |
原始字段们 | 表字段快照内容 |
特性 | CDC | 触发器 | 时间戳轮询 |
---|---|---|---|
系统侵入性 | 无 | 高 | 无 |
数据延迟 | 中等(秒级) | 低(毫秒) | 高(分钟) |
资源开销 | 中 | 高 | 中 |
支持删除识别 | ✅ | ✅ | ❌ |
SeaTunnel 原生支持 | ✅ | ❌ | ✅ |
SQL Server Agent 必须启用
建议单独建 CDC 用户(只读权限)
CDC 清理策略默认 3 天,可调长:
EXEC sys.sp_cdc_change_job @job_type = 'cleanup', @retention = 43200 -- 单位:分钟(30天)
SQL Server 的 CDC 机制为企业提供了一种性价比极高的数据变更捕获能力,具备非侵入、低延迟、删除识别等优势。结合 Apache SeaTunnel 的原生支持能力,能够快速构建起高性能、可扩展的实时数据集成管道,适用于 AI 数据底座、数据湖构建、异构数据库同步等多种场景。