什么是变更数据捕获 (CDC)?
什么是变更数据捕获 (CDC)?
什么是变更数据捕获 (CDC)?
变更数据捕获(CDC)是SQL Server和Azure SQL托管实例中的一个功能,用于记录数据库表的插入、更新和删除操作。它通过SQL Server代理记录这些更改,并将相关信息存储在与源表结构相匹配的更改表中。这种机制特别适用于需要增量加载数据到数据仓库或数据市场的ETL应用程序。
概述
CDC的核心是通过SQL Server代理读取事务日志,将表中的更改记录到专门的更改表中。这些更改可以通过表值函数供使用者访问,从而实现数据的增量更新。这种技术特别适合于数据仓库环境,其中源表的表示需要反映源表的更改,但又不能简单地刷新整个源副本。
数据流
CDC的数据流如下图所示:
变更数据捕获的更改数据源为SQL Server事务日志。在对跟踪的源表进行插入、更新和删除操作时,这些更改会被记录在日志中。捕获进程读取日志,并在关联的更改表中添加有关这些更改的信息。系统提供的函数可以枚举在更改表中指定范围内发生的更改,并以筛选的结果集形式返回这些数据。
捕获实例
在跟踪对数据库中任何单个表进行的更改之前,必须为数据库显式启用变更数据捕获。这可以通过sys.sp_cdc_enable_db
存储过程完成。为数据库启用变更数据捕获后,可以使用sys.sp_cdc_enable_table
存储过程将源表标识为跟踪的表。为表启用变更数据捕获后,将创建一个关联的捕获实例以支持传播源表中的更改数据。
更改表
变更数据捕获更改表的前五列是元数据列,提供与记录的更改有关的附加信息。其余列镜像源表中按名称标识的捕获列。这些列保存从源表中收集的捕获列数据。
有效性间隔
数据库的变更数据捕获有效性间隔是指更改数据可供捕获实例使用的时段。默认情况下,数据保留期为三天。捕获进程从事务日志中提取更改数据,因此,向源表提交更改的时间与更改出现在其关联更改表中的时间之间存在内置延迟。
处理对源表的更改
对于下游使用者来说,适应所跟踪源表中的列更改是一个难题。变更数据捕获通过保留通过API返回的交付结果集来减轻对使用者的影响,即使基础源表的列结构发生更改也是如此。
与日志读取器代理的关系
变更数据捕获进程逻辑嵌入在存储过程sp_replcmds
中,后者是作为sqlservr.exe一部分生成的内部服务器函数,事务复制也会使用它从事务日志中收集更改。在SQL Server和Azure SQL托管实例中,如果仅为数据库启用了变更数据捕获,可以将变更数据捕获SQL Server代理捕获作业作为调用sp_replcmds
的载体进行创建。
代理作业
通常有两个SQL Server代理作业与启用了变更数据捕获的数据库关联:一个作业用于填充数据库更改表,另一个作业负责清理更改表。两个作业都包含一个运行Transact-SQL命令的步骤。调用的Transact-SQL命令是变更数据捕获定义的存储过程,用于实现作业逻辑。
与其他功能的互操作性
使用其他SQL Server功能时,变更数据捕获存在一些限制。查看互操作性以了解详细信息。
已知问题
有关与变更数据捕获关联的已知问题和错误,请查看CDC的已知问题。