问题
我目前在名为subscription_events的表上运行 CDC 。相应的 CT 表正在填充新的插入、更新和删除。
我有两个 SSIS 流,它们将数据从订阅事件移动到不同数据库中的另一个表中。第一个流程是初始流程,具有以下布局:
Import Rows Into Vertica步骤只包含一个源和一个目标,并将每一行复制到另一个表中。请注意,源表当前处于活动状态,并且每隔几分钟就会有新行流入。标记初始加载开始/结束步骤将当前状态存储在一个变量中,该变量存储在一个单独的表中,用于存储 CDC 名称和状态。
第二个流程是增量流程,具有以下布局:
将行导入 Vertica步骤使用 CDC 源,应该从 CT 表中提取最新的插入、更新和删除,并且这些应该应用到目标。这就是问题所在;我从未从 CDC 源收到任何信息,即使订阅事件表中插入了新行,并且相应的 CT 表的大小随着新的更改数据而增长。
据我了解,事情应该是这样的:
- 标记初始加载开始
- CDC 状态应为ILSTART
- 数据流
- 标记初始加载结束
- CDC 状态应为ILEND
- 获取处理范围(首次运行)
- CDC 状态应该是ILUPDATE
- 数据流
- 标记处理范围(首次运行)
- CDC 状态应该是TFEND
- 获取处理范围(后续运行)
- CDC 状态应为TFSTART
- 数据流
- 标记处理范围(后续运行)
- CDC 状态应该是TFEND
- 重复最后三个步骤
不过,这不是我的 CDC 状态的设置方式……这是我在同一过程中的状态。
- 标记初始加载开始
- CDC 状态为ILSTART
- 数据流
- 标记初始加载结束
- CDC 状态为ILEND
- 获取处理范围(首次运行)
- CDC 状态为ILUPDATE
- 数据流
- 标记处理范围(首次运行)
- CDC 状态为ILEND
- 获取处理范围(后续运行)
- CDC 状态为ILUPDATE
- 数据流
- 标记处理范围(后续运行)
- CDC 状态为ILEND
- 重复最后三个步骤
我永远无法摆脱ILUPDATE/ILEND循环,因此我永远无法从 CT 表中获取任何新数据。为什么会发生这种情况,我能做些什么来解决这个问题?
非常感谢您的帮助!:)
编辑 1
这里有几篇描述我的情况的文章,虽然不完全。他们也没有帮助我解决这个问题,但它可能会帮助你想到一些我可以尝试的东西。
- http://www.bradleyschacht.com/understanding-the-cdc-state-value/
- http://msdn.microsoft.com/en-us/library/hh231087.aspx
第二篇文章包括这张图片,它显示了我陷入的ILUPDATE/ILEND循环。
编辑 2
上周(2014 年 5 月 26 日)我在subscription_events表上禁用然后重新启用了 CDC。这并没有改变任何东西,所以我在整个数据库上禁用了 CDC,在数据库上重新启用了 CDC,然后在subscription_events表上启用了 CDC。这确实使 CDC 工作了几天(我认为通过这个过程已经解决了问题)。但是,在上周末(2014 年 5 月 30 日)我需要通过这个过程重新加载整个表,我又遇到了同样的问题。我仍然被困在这个循环中,我不确定为什么或如何摆脱它。
编辑 3
在我遇到这个问题之前,我有一个单独的问题,我在这里发布了:
CDC 已启用,但未填充 cdc.dbo<table-name>_CT 表
我不确定这些是否相关,但认为提供它并没有什么坏处。