1、CDC适用的环境:
SQL Server 2008版本以上的企业版本、开发版本和评估版本可用。
需要开启代理服务。
CDC需要业务库之外的额外磁盘空间。
CDC的表需要主键或者唯一主键。
2、CDC的功能介绍:
开启CDC的源表在插入INSERT、更新UPDATE和删除DELETE活动时会插入到日志表中。CDC通过捕获进程将变更数据捕获到变更表中,通过CDC提供的查询函数
3、变更数据捕获原理:
变更数据捕获的更改数据源为SQL Server事务日志。当对表启用变更数据捕获时,系统将发生一个与该表结构类似的副本。当对源表进行插入、更新和删除时,在事务日志会记录相关操作信息。变更数据捕获代理使用异步进程读取事务日志,将相关操作结果应用到副本表(捕获实例表)中,这样就完成了对源表操作的记录跟踪。
4、开启数据库级别的CDC功能:
USE dba
GO
EXEC sys.sp_cdc_enable_db --开启数据库级别CDC
GO
EXEC sys.sp_cdc_disable_db --关闭数据库级别CDC
注意:如果在禁用变更数据捕获时为数据库定义了很多捕获实例,则长时间运行事务可能导致sys.sp_cdc_disable_db的执行失败。通过在运行sys.sp_cdc_disable_db之前使用sys.sp_cdc_disable_table禁用单个捕获实例,可以避免此类问题。
查询数据库是否开启了CDC功能:
SELECT is_cdc_enabled,* FROM sys.databases WHERE name='dba'
0表示禁用,1表示开启
如果有需要或者需要开启CDC的表特别的多,建议考虑为CDC专门创建一个文件组用于存放CDC的数据。
5、开启表级别的CDC:
模板:
EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', -- source_schema
@source_name = 'table_name', -- table_name
@capture_instance = NULL, -- capture_instance
@supports_net_changes = 1, -- supports_net_changes
@role_name = NULL, -- role_name
@index_name = NULL, -- index_name
@captured_column_list = NULL, -- captured_column_list
@filegroup_name = 'primary'; -- filegroup_name;
例如开启CallResult表的CDC功能:
EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', -- source_schema
@source_name = 'CallResult', -- table_name
@capture_instance = NULL, -- capture_instance
@supports_net_changes = 1, -- supports_net_changes
@role_name = NULL, -- role_name
@index_name = NULL, -- index_name
@captured_column_list = NULL, -- captured_column_list
@filegroup_name = 'primary'; -- filegroup_name;
查询哪些表开启了CDC功能:
select name,type,create_date,modify_date,is_tracked_by_cdc from sys.tables where is_tracked_by_cdc = 1;
6、关闭相关表的CDC功能:
EXEC sys.sp_cdc_help_change_data_capture 'dbo', 'CallResult' --先查下表的source_name和capture_instance
EXECUTE sys.sp_cdc_disable_table @source_schema = N'dbo',
@source_name = N'CallResult',
@capture_instance = N'dbo_CallResult';
7、开启了表级别的CDC功能后会创建下面的一些对象:
系统表:

用户和角色

代理作业

系统存储过程

8、CDC的优缺点
优点:
可以对单个表进行监控,也可以对单个表的某些字段进行监控,使用较为灵活。
对用户修改以前的历史记录可以有效捕捉,因此可以解决没有时间戳的变更问题。
使用这种技术,就可以不用再使用trigger这种低效高消耗的技术。
是一种很好的向数据仓库或数据库中心增量加载数据的好方法。
缺点:
CDC激活会显著增加日志文件的读操作。
CDC激活后更新跟踪表会产生额外的写入,并消耗存储空间。
CDC激活后,原数据表的聚集索引尺寸会影响到CDC产生的IO数据量,而原始数据表上的非聚集索引则不会。
CDC激活后,被选定进行更新跟踪的列键值属性同样会影响到CDC产生的IO数据量和存储空间。
如果某部分日志,CDC进程没有读取,那么在截断日志时会忽略这个部分(截断日志或者收缩日志都会对CDC有一定影响,需要考虑日志维护策略)




