SSIS CDC 增量抽取

SSIS CDC 增量抽取

参照链接:

先吐槽:为什么就给了CDC源, CDC 拆分器 ? 插入,更新,删除不能一起搞个什么工具吗(主要是更新)? 对于更新而言,字段少还好说sql任务拼一拼可以接受,字段一多整个人就不好了。。。 写完还不能确定写全了 写对了 简直绝望。。。。

其实按照上面的流程基本就能明白如何抽取了,下面我说一下我遇到的两个问题

初始化包

或许有的人看第一个教程的时候对初始化包那块有点疑惑:初始化数据在哪儿加呢 但仔细一下也能明白 作者给了一个数据流任务 但什么都没有处理 我们可以在这里将数据初始化。
我遇到的问题就在这块了

cdc控制任务记录了初始化开始lsn 和结束的 lsn然后存储到了CDC_STATE, 增量包在开始执行任务的时候,会从CDC_STATE得到这两个sln(具体可以看看定义状态变量这个链接),在cdc表获取最大lsn,返回的是初始化lsn和最大化lsn之间的数据,这个流程应该没问题。

问题:在控制任务lsn初始化后 也就是初始开始lsn已经有值了,我在初始化数据的过程中并不是完全获取lsn之前的数据,时间差很小,但刚好这时间了捕获到了数据更新,而我又当作初始化数据插入了,最后在增量同步的时候 这部分数据插入就会存在问题 因为主键重复了 压根插不进去。

解决方法就没什么说的了 ,反正初始化就一次 根据CDC_STATE 获取初始化 这段时间的数据捕获记录,然后根据捕获记录id把表中存在的删除就行了。

CDC控制操作还有一种 叫做标记 CDC 开始,这个可以主动传入一个lsn作为增量抽取起始lsn. 应该也可以解决上面这个问题 有兴趣的可以试试

数据更新

简单来说 还是主键重复的问题 我们的数据更新记录存到了临时表 图省事 就根据原表复制建了一个 在一次抽取过程中 同一数据被修改了两回 也就是有了两条记录 然后插入临时表的时候就出错了(当然 你可以建一个不把id设为主键的临时表就没这问题了)

我想说了是 这个问题 让我注意到了另一个细节:CDC处理模式 (具体在CDC源的链接中查看)

简单来说,CDC处理模式分为五种:

所有:返回当前 CDC 范围中的更改,但没有 “更新前” 值。

全部且具有旧值:返回当前 CDC 处理范围中的更改,包括旧值(“更新前”)。 对于每个更新操作将会有两行,一个针对更新前值,一个针对更新后值。

净值:对于当前 CDC 处理范围中修改的每个源行,仅返回一个更改行。 如果某一源行更新了多次,将生成合并的更改(例如,插入+更新作为单个更新生成,更新+删除作为单个删除生成)。 在净更改处理模式下工作时,可以拆分对删除、插入和更新输出的更改并且并行处理它们,因为单个源行出现多次。

具有更新掩码的净值:此模式类似于一般的净值模式,但它还添加了命名模式为 $<column-name>__Changed 的布尔值列(指示当前更改行中已更改的列)。

净值且具有合并:此模式类似于一般的净值模式,但具有合并到单个合并操作中的插入和更新操作 (UPSERT)。

一般不做更改 都是默认所有,我们这里只要选择净值就可以解决问题了

ps:别忘了还有备注

对于所有净更改选项,源表必须具有主键或唯一索引。 对于不具有主键或唯一索引的表,您必须选择 “全部” 选项。

对于更新而言,注意联合主键的情况!!!

posted @ 2018-06-12 19:16  waslm  阅读(402)  评论(0编辑  收藏  举报