如何使用SQL Server CDC重新加载增量数据?

时间:2015-02-24 18:07:35

标签: sql-server ssis etl cdc

我无法找到有关如何使用带有SSIS的SQL Server 2014中的变更数据捕获(CDC)重新加载增量数据的文档/说明。

基本上,在某一天,如果您的SSIS增量处理失败并且您需要重新开始。你如何再次播放最近更改的记录?

3 个答案:

答案 0 :(得分:2)

我想这取决于你对数据做了什么,是吗? :)但是,在一般情况下,您可以将其分解为三种情况:

  1. 插入 - 检查行是否存在。如果是,请跳过它。如果没有,请插入。
  2. 删除 - 假设您没有重复使用主键,只需再次运行删除即可。它会找到要删除的行或者它不会被删除,但最终结果是删除后该行的PK不会存在。
  3. 更新 - 有点像删除方案。如果您重新处理更新,这并不是什么大不了的事(假设您的CDC流程是唯一能够在目的地保持最新状态并且没有覆盖某人/其他人的危险的事情&#39 ; s改变)。

答案 1 :(得分:2)

假设您正在使用新的CDC SSIS 2012组件,特别是软件包开头和结尾的CDC控制任务。然后,如果程序包在运行程序包末尾的CDC控制任务之前因任何原因而失败,那么这些LSN(日志序列号)将不会被标记为已处理,因此您可以在修复问题后从顶部重新启动SSIS程序包。它将再次重新处理这些记录。您必须使用CDC控制任务来完成这项工作或自己跟踪LSN(在SSIS 2012之前,这是唯一的方法)。

Matt Masson(MSFT SQL Server团队的高级项目经理)有一个很好的帖子,有一个分步演练:CDC in SSIS for SQL Server 2012

另外,请参阅Bradley Schacht的帖子:Understanding the CDC state Value

答案 2 :(得分:0)

要重新加载相同的更改,可以使用以下方法。

方法#1 :将[cdc_states]表中的TFEND标记存储在另一个表或变量中。将标记从“保存的”值重新加载到[cdc_states],以再次处理相同的范围。但是,此方法允许您从相同的LSN开始处理,但是如果与此同时您更改表中有更多更改,这些更改也将被捕获。因此,您有可能获得第一次数据捕获后发生的更多更改。

方法2 :为了捕获指定的范围,请在处理范围之前和之后记录TFEND标记。现在,您可以将OLEDB源连接(SSIS)与以下cdc功能一起使用。然后像往常一样使用CDC拆分器来指示插入,更新和删除。

DECLARE @start_lsn binary(10);
DECLARE @end_lsn binary(10);
SET @start_lsn = 0x004EE38E921A01000001;-- TFEND (1) -- if null then sys.fn_cdc_get_min_lsn('YourCapture') to start from the beginnig of _CT table
SET @end_lsn = 0x004EE38EE3BB01000001;  -- TFEND (2)
    SELECT * FROM [cdc].[fn_cdc_get_net_changes_YOURTABLECAPTURE](
     @start_lsn
    ,@end_lsn
    ,N'all' -- { all | all with mask | all with merge }
    --,N'all with mask' -- shows values in "__$update_mask" column
    --,N'all with merge' -- merges inserts and updates together. It's meant for processing the results using T-SQL MERGE statement
    )
ORDER BY __$start_lsn;