暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

SQL Server 2016开启CDC功能捕获变更数据

原创 沙沃兴 2022-12-20
1268

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有一定影响,需要考虑日志维护策略)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论