更改数据捕获和其他 SQL Server 功能

本主题介绍以下功能如何与变更数据捕获交互:

更改跟踪

可以在同一数据库上启用更改数据捕获和 更改跟踪 。 没有特殊的注意事项。 有关详细信息,请参阅“使用更改跟踪”(SQL Server)。

数据库镜像

已启用更改数据捕获的数据库可以进行镜像。 若要确保在故障转移后自动完成捕获和清理,请执行以下步骤:

  1. 确保 SQL Server 代理在新主体服务器实例上运行。

  2. 在新主体数据库(前镜像数据库)上创建捕获作业和清理作业。 若要创建作业,请使用 sp_cdc_add_job 存储过程。

若要查看清理或捕获作业的当前配置,请使用新主体服务器实例上的 sys.sp_cdc_help_jobs 存储过程。 对于给定的数据库,捕获作业名为 cdc。database_name_capture,清理作业名为 cdc。database_name_cleanup,其中 database_name 是数据库的名称。

若要更改作业的配置,请使用 sys.sp_cdc_change_job 存储过程。

有关数据库镜像的信息,请参阅数据库镜像(SQL Server)。

事务复制

更改数据捕获和事务复制可以共存在同一数据库中,但启用这两个功能时,更改表的总体处理方式不同。 更改数据捕获和事务复制始终使用相同的过程 sp_replcmds 从事务日志读取更改。 当自行启用更改数据捕获时,SQL Server 代理作业将调用 sp_replcmds。 在同一数据库上启用这两项功能时,日志读取器代理将调用 sp_replcmds。 此代理同时填充更改表和分发数据库表。 有关详细信息,请参阅 复制日志读取器代理

请考虑在 AdventureWorks2012 数据库上启用更改数据捕获的方案,并为捕获启用两个表。 若要填充更改表,捕获作业将调用 sp_replcmds。 为事务复制启用数据库,并创建发布。 现在,将为数据库创建日志读取器代理,并删除捕获作业。 日志读取器代理继续从提交到更改表的最后一个日志序列号扫描日志。 这可确保更改表中的数据一致性。 如果在此数据库中禁用了事务复制,则会删除日志读取器代理,并重新创建捕获作业。

注释

当日志读取器代理用于更改数据捕获和事务复制时,复制的更改首先写入分发数据库。 然后,捕获的更改将写入更改表。 这两个操作一起提交。 如果在写入分发数据库时存在任何延迟,则更改显示在更改表中之前,会有相应的延迟。

启用更改数据捕获时,事务复制的 proc exec 选项不可用。

还原或附加启用了更改数据捕获的数据库

SQL Server 使用以下逻辑来确定在还原或附加数据库后是否仍启用更改数据捕获:

  • 如果数据库还原到具有相同数据库名称的同一服务器,更改数据捕获将保持启用状态。

  • 如果数据库还原到另一台服务器,则默认禁用更改数据捕获,并删除所有相关元数据。

    若要保留更改数据捕获,在还原数据库时请使用 KEEP_CDC 选项。 有关此选项的详细信息,请参阅 RESTORE

  • 如果数据库已分离并附加到同一服务器或其他服务器,则更改数据捕获将保持启用状态。

  • 如果数据库被附加或还原,并使用 KEEP_CDC 选项到企业版以外的任何版本,操作将被阻止,因为变更数据捕获功能需要 SQL Server 企业版。 显示错误消息 934:

    SQL Server cannot load database '%.*ls' because change data capture is enabled. The currently installed edition of SQL Server does not support change data capture. Either disable change data capture in the database by using a supported edition of SQL Server, or upgrade the instance to one that supports change data capture.

可以使用 sys.sp_cdc_disable_db 从被还原或附加的数据库中移除变更数据捕获。

更改数据捕获和 AlwaysON

使用 Always On 功能时,应将更改枚举过程在从属副本上完成,以减少主副本上的磁盘负载。

另请参阅

管理和监视变更数据捕获 (SQL Server)