更改数据捕获 (SQL Server 2008)





4.00/5 (7投票s)
SQL Server 2008 中的变更数据捕获 (shujaatsiddiqi.blogspot.com)
引言
在数据库管理员的工作中,历史以来,变更管理一直是一项艰巨的任务。已经采用了许多解决方案,从在每个表中设置 CreateData
和 ModifiedDate
字段,到为 DML 操作设置 DML 触发器。在 SQL Server 2005 中,DDL 触发器是管理 DDL 操作的唯一选择。随着 SQL Server 2008 引入的许多新功能,CDC (变更数据捕获) 是其中一项值得讨论的功能。
配置
为了理解 SQL Server 2008 中 CDC 的配置,我们创建一个名为 CDC_Practice
的新数据库。

当从上下文菜单中选择“新建数据库”时,将出现以下表单

我们使用默认选项创建数据库(只需指定数据库名称为 CDC_Practice
)然后按“确定”按钮。
现在,我们应该为我们的数据库启用 CDC。SQL Server 2008 配备了一个新的存储过程,名为 sys.sp_cdc_enable_db。我们只需执行此存储过程。
USE CDC_Practice
Exec sys.sp_cdc_enable_db
我们可以通过检查 sys.databases 表中新添加的 is_cdc_enable
字段来验证它是否已在我们的数据库中启用。

执行此命令时,您还不能不看一些新创建的系统表。还创建了一个名为 cdc
的用户以及一个名为 cdc
的架构。

通常,我们有许多表需要进行此类审计。能够指定要为其启用 CDC 的特定表是很好的。我们创建一个名为 EX_Table
的表。
Use CDC_Practice
Go
Create table EX_Table
(
ID Int Identity(1,1) Primary Key NOT NULL,
Name varchar(10)
)
正如我之前提到的,我们可以为特定表启用 CDC。所以,我们应该尝试为我们的 EX_table
表启用它。
Use CDC_Practice
Go
EXEC sp_cdc_enable_table 'dbo', 'Ex_table', @role_name = NULL, @supports_net_changes =1
Go
我们可以借助 sys.tables 中新增的一个属性 is_tracked_by_cdc
来验证 CDC 是否已启用。如果结果为 1
,则表示已在指定表上启用。我们在 EX_Table
表上进行检查。
SELECT is_tracked_by_cdc FROM sys.tables
WHERE name = 'EX_Table'
在为表启用 CDC 之前,我们需要确保 SQL Server Agent 正在运行。这是因为它也会为此目的创建两个作业。创建的两个作业如下:
cdc.CDC_Practice_capture
cdc.CDC_Practice_cleanup
DDL 捕获
到目前为止,我们只讨论了捕获数据操作。那么捕获 DDL 相关任务怎么样?在 SQL Server 2005 中,引入了 DDL 触发器。直到现在,这是记录已执行 DDL 语句的唯一选项。在 SQL Server 2008 中,这些 DDL 语句可在 ddl_history
表中找到。该表也可能用于创建一个与第一个数据库完全相同的数据库。
这仍然比 DDL 触发器更有益,因为 DDL 触发器会导致数据库应用程序中的单点故障。如果出现任何问题,则不允许更改数据库架构。有了 CDC,这个问题也得到了缓解。
引入的存储过程
为了支持 CDC,还引入了一些存储过程。它们如下:
sp_cdc_add_job
:用于创建捕获或清理作业。sp_cdc_change_job
:用于修改捕获或清理作业配置。sp_cdc_cleanup_change_table
:删除更改表中的所有记录。sp_cdc_disable_db
:禁用当前数据库的 CDC。sp_cdc_disable_table
:禁用指定表的 CDC。sp_cdc_drop_job
:删除更改或捕获作业。sp_cdc_enable_db
:启用指定数据库的 CDC。sp_cdc_enable_table
:启用指定表的更改跟踪。它还会创建一些实用对象,如表等。sp_cdc_get_ddl_history
:提供指定 CDC 实例的 DDL 历史记录。sp_cdc_help_change_data_capture
:提供当前数据库中启用 CDC 的每个表的 CDC 信息。sp_cdc_help_jobs
:提供有关更改和捕获作业的信息。sp_cdc_scan
:由sp_cdc_enable_table_change_data_capture
内部调用。它执行 CDC 日志扫描操作。sp_cdc_startjob
:为当前数据库启动 CDC 捕获或清理作业。sp_cdc_stopjob
:为当前数据库停止 CDC 捕获或清理作业。
必须注意,上述所有存储过程都定义在 sys 架构中。
引入的函数
对于 CDC 跟踪的每个表,都添加了两个表值函数。它们如下:
fn_cdc_get_all_changes_dbo_TableName
:为启用 CDC 的每个新表创建。fn_cdc_get_net_changes_dbo_TableName
上述两个函数都有三个必需参数。它们包括开始 LSN、结束 LSN 和行筛选器选项。行筛选器选项具有可能的值“all”、“all with mask”或“all with merge”。
元数据函数
CHANGE_TRACKING_CURRENT_VERSION
Change_tracking_current_version()
Change_Tracking_Is_Column_In_Mask()
引入的系统表
如果数据库未启用 CDC,我们将为数据库启用变更数据捕获。当我们为数据库启用 CDC 时,将创建名为 'cdc
' 的架构,并且还会在该架构中自动创建以下六个系统表。必须记住,直接查询系统表是不推荐的。相反,应该使用 2008 中引入的新存储过程。
cdc.captured_columns
:此表包含所有更改表的所有捕获列的信息。cdc.change_tables
:此表包含数据库中的所有更改表。- cdc.ddl_history:启用 CDC 后 DDL 语句的历史记录。
cdc.index_columns
:此表包含与更改表关联的每个索引列的信息。cdc.lsn_time_mapping
:包含更改表中每个事务的信息。cdc.*_CT
:此表是为 CDC 跟踪的每个表创建的。它包含启用 CDC 后对数据执行的所有 DML 操作。不再需要 DML 触发器仅用于审计表中的数据更改。CT 是 **Change Table** 的缩写。
对 sys.Databases 表的更改
在 SQL Server 2008 中,向 sys.databases
表添加了一个新字段。该字段为 is_cdc_enabled
。此字段指示 CDC 是否已为特定数据库启用。
限制
- 不支持发布者/订阅者模型。因此,无法基于某些更改触发任何操作。对于此类需求,我们仍然需要依赖我们旧的触发器方法。
- 这是一个异步操作。虽然异步操作最大限度地减少了性能影响,但在某些需求中,只能决定进行同步操作。
- CDC 不能在堆上启用,即不能在没有主键的表上启用。
注意
SQL Server 2008 还发布了另一项功能 - 更改跟踪。必须记住,它与 CD 不同
- 它仅为您提供数据库表中的净更改。
- 它是同步的。
历史
- 2008 年 8 月 11 日:初始帖子