我有一个要求,即在新添加的表的列上启用CDC,但我无法禁用CDC并再次启用它。有什么办法可以做到这一点?如何在不禁用CDC的情况下激活对新添加的基础表列的更改数据捕获(CDC)
我发现了一个解决方案,我可以将旧的CDC表值复制到临时表中,然后禁用CDC,然后使用新的表架构启用CDC。稍后将临时表值复制到新的CDC表中并更新LSN值。
而不是上述我需要一个解决方案,我可以在启用CDC时将新列包括到CDC表中。
我有一个要求,即在新添加的表的列上启用CDC,但我无法禁用CDC并再次启用它。有什么办法可以做到这一点?如何在不禁用CDC的情况下激活对新添加的基础表列的更改数据捕获(CDC)
我发现了一个解决方案,我可以将旧的CDC表值复制到临时表中,然后禁用CDC,然后使用新的表架构启用CDC。稍后将临时表值复制到新的CDC表中并更新LSN值。
而不是上述我需要一个解决方案,我可以在启用CDC时将新列包括到CDC表中。
CDC支持两个捕获表实例。所以,你可以做以下步骤:
此解决方案可防止您停止收集更改,并且不会丢失数据。
EXEC sp_cdc_enable_table
@source_schema = N'common',
@source_name = N'EntityTypes',
@role_name = NULL,
@filegroup_name = N'CDC',
@capture_instance = 'common_EntityTypes'
ALTER TABLE common.EntityTypes
ADD TestColumn int
EXEC sp_cdc_enable_table
@source_schema = N'common',
@source_name = N'EntityTypes',
@role_name = NULL,
@filegroup_name = N'CDC',
@capture_instance = 'common_EntityTypes2'
INSERT INTO cdc.common_EntityTypes2_CT
(__$start_lsn, __$end_lsn,__$seqval,__$operation,__$update_mask,Id,Name)
SELECT
__$start_lsn,
__$end_lsn,
__$seqval,
__$operation,
__$update_mask,
Id,
Name
FROM cdc.common_EntityTypes_CT
EXEC sp_cdc_disable_table
@source_schema = N'common',
@source_name = N'EntityTypes',
@capture_instance = 'common_EntityTypes'
,但是当我对新添加的列“TestColumn”执行了DDL操作时,在新创建的实例cdc中未捕获到更改。common_EntityTypes2_CT – Mohan
“将数据从旧表移动到新表”。说“移动你的ETL过程来使用新的CDC实例”会更准确吗?也就是说,通过将第二个实例的min LSN用作第一个捕获实例的端点,可以将两个实例吻合。一旦从第一个处理完所有记录直至并包括该端点,您就可以将ETL切换为使用第二个记录,并从那里继续处理。就我个人而言,我喜欢使用抽象(即同义词或视图)来隐藏我正在切换CDC实例的事实。 –
@Mohan你必须在添加新列后创建新的cdc实例 – Backs
上述解决方案效果很好,当你对目标表中的单个实例,但如果你有两个实例已经,你可能需要考虑远一点出来,并使用一些规划。
数据丢失的问题是相关的,但最初设计cdc过程时可能会考虑这个问题,一个非常相关的项目是数据的终点是什么?例如,如果您正在使用BI解决方案,可能使用仓库或者像数据集市这样的简单OLAP DB作为报告解决方案,那么您可以考虑引入维护时段或利用当前的维护时段。这个过程很简单,并且与Backs的答案不同:
将所有当前_CT数据传输到终点。
禁用表上的当前实例(sp_cdc_disable_table)
与更新的列列表中再次启用实例(sp_cdc_enable_table)
这允许改变来实现即使两个实例已经将目标锁定在同一个表上,而不会丢失客户端数据
注意:使用列列表参数并不是一个必要条件(如果您希望捕获所有列),但当其他开发人员可能需要查看代码时,它可能更适合一致性。尽管如此,通过cdc.X系统表获取数据也同样简单。
将[新的列添加到源表后,CDC表不能正常工作](http://stackoverflow.com/questions/14958119/cdc-table-not-working-after-adding-new-columns-to -the-source-table) –
@ M.Hassan我不想在添加新列时禁用CDC。 – Mohan