目录标题
概述
当然可以!以下是基于 Microsoft 官方文档整理的 SQL Server Change Data Capture(CDC)功能超全面介绍,涵盖其原理、架构、关键对象、使用方法、管理与监控、以及与其他技术的对比,适用于 SQL Server 和 Azure SQL 数据库环境。
📌 什么是 Change Data Capture(CDC)?
- CDC 是 SQL Server 提供的一种功能,用于捕获对数据库表的插入、更新和删除操作,并将这些变更记录到专门的变更表中。这些变更表的结构与源表相似,包含了变更的数据和相关的元数据,如操作类型、变更时间等。
- CDC 主要用于支持数据仓库加载、审计、同步等场景。
🧱 CDC 的架构与工作原理
-
数据源:CDC 通过读取 SQL Server 的事务日志(Transaction Log)来捕获数据变更。
-
捕获进程:SQL Server Agent 中的捕获作业(Capture Job)定期扫描事务日志,将变更数据写入到相应的变更表中。(Microsoft Learn)
-
变更表:每个启用 CDC 的表都有一个对应的变更表,默认命名为
cdc.<schema>_<table>_CT
,用于存储变更的数据和元数据。 -
查询函数:系统会为每个启用 CDC 的表生成两个表值函数(TVFs):
cdc.fn_cdc_get_all_changes_<capture_instance>
:返回指定时间范围内的所有变更。cdc.fn_cdc_get_net_changes_<capture_instance>
:返回指定时间范围内的净变更(即每行的最终状态)。(Microsoft Learn, Microsoft Learn)
⚙️ 启用和配置 CDC
1. 启用数据库级别的 CDC
USE YourDatabaseName;
EXEC sys.sp_cdc_enable_db;
执行后,系统会创建名为 cdc
的架构和相关的系统对象。
2. 启用表级别的 CDC
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'YourTableName',
@role_name = NULL,
@supports_net_changes = 1;
参数说明:
@source_schema
:源表的架构名。@source_name
:源表的名称。@role_name
:访问变更数据所需的数据库角色,设置为NULL
表示不限制。@supports_net_changes
:是否支持净变更查询,1
表示支持。(Microsoft Learn)
🧪 查询和使用变更数据
1. 查询所有变更
SELECT *
FROM cdc.fn_cdc_get_all_changes_dbo_YourTableName
(
@from_lsn = sys.fn_cdc_get_min_lsn('dbo_YourTableName'),
@to_lsn = sys.fn_cdc_get_max_lsn(),
@row_filter_option = 'all'
);
2. 查询净变更
SELECT *
FROM cdc.fn_cdc_get_net_changes_dbo_YourTableName
(
@from_lsn = sys.fn_cdc_get_min_lsn('dbo_YourTableName'),
@to_lsn = sys.fn_cdc_get_max_lsn(),
@row_filter_option = 'all'
);
🧹 管理与监控 CDC
-
查看启用的 CDC 表:
SELECT * FROM cdc.change_tables;
-
查看捕获的列:
SELECT * FROM cdc.captured_columns;
-
查看 CDC 作业状态:
SELECT * FROM msdb.dbo.cdc_jobs;
-
手动启动或停止 CDC 作业:
EXEC sys.sp_cdc_start_job @job_type = N'capture'; EXEC sys.sp_cdc_stop_job @job_type = N'capture';
🔄 禁用 CDC
1. 禁用表级别的 CDC
EXEC sys.sp_cdc_disable_table
@source_schema = N'dbo',
@source_name = N'YourTableName',
@capture_instance = N'dbo_YourTableName';
2. 禁用数据库级别的 CDC
EXEC sys.sp_cdc_disable_db;
📊 与其他技术的对比
特性 | CDC | Change Tracking | 触发器(Triggers) | |
---|---|---|---|---|
捕获的数据 | 完整的变更数据(包括前后值) | 仅记录变更的主键或列信息 | 可自定义 | |
性能影响 | 较低(异步处理) | 较低(同步处理) | 可能较高(同步处理) | |
使用场景 | 数据仓库、审计、同步等 | 缓存同步、轻量级变更跟踪 | 复杂逻辑处理、数据验证等 | |
实现复杂度 | 中 | 低 | 高 | (Microsoft Learn) |