SQL Server Change Data Capture(CDC)功能

概述

什么是变更数据捕获 (CDC)?

当然可以!以下是基于 Microsoft 官方文档整理的 SQL Server Change Data Capture(CDC)功能超全面介绍,涵盖其原理、架构、关键对象、使用方法、管理与监控、以及与其他技术的对比,适用于 SQL Server 和 Azure SQL 数据库环境。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


📌 什么是 Change Data Capture(CDC)?

  • CDC 是 SQL Server 提供的一种功能,用于捕获对数据库表的插入、更新和删除操作,并将这些变更记录到专门的变更表中。这些变更表的结构与源表相似,包含了变更的数据和相关的元数据,如操作类型、变更时间等。
  • CDC 主要用于支持数据仓库加载、审计、同步等场景。

🧱 CDC 的架构与工作原理

  1. 数据源:CDC 通过读取 SQL Server 的事务日志(Transaction Log)来捕获数据变更。

  2. 捕获进程:SQL Server Agent 中的捕获作业(Capture Job)定期扫描事务日志,将变更数据写入到相应的变更表中。(Microsoft Learn)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 变更表:每个启用 CDC 的表都有一个对应的变更表,默认命名为 cdc.<schema>_<table>_CT,用于存储变更的数据和元数据。

    在这里插入图片描述

  4. 查询函数:系统会为每个启用 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;

📊 与其他技术的对比

特性CDCChange Tracking触发器(Triggers)
捕获的数据完整的变更数据(包括前后值)仅记录变更的主键或列信息可自定义
性能影响较低(异步处理)较低(同步处理)可能较高(同步处理)
使用场景数据仓库、审计、同步等缓存同步、轻量级变更跟踪复杂逻辑处理、数据验证等
实现复杂度(Microsoft Learn)

🌐 参考资料


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值