【发布时间】:2014-08-13 14:34:50
【问题描述】:
我是 SQL Server 的初学者。对于一个项目,我需要打开 CDC。我将 cdc 数据复制到另一个(存档)数据库,之后可以立即清理 CDC 表。所以保留时间不需要很长,我只是把它放在 1 分钟,当清理作业运行时(在保留时间已经完成之后),它似乎只删除了几条记录(最旧的记录)。为什么不删除所有内容?有时它根本不会删除任何东西。运行该作业几次后,其他记录将被删除。我觉得这很奇怪,因为保留时间已经过去了。
我将保留时间设置为 1 分钟(我实际上想要 0,但这是不可能的)并且没有更改阈值 (= 5000)。我禁用了该计划,因为我希望在将 CDC 记录复制到我的存档数据库后立即运行清理作业,而不是在特定时间运行。
我对这个想法的逻辑是,例如下午会有更新。将 CDC 记录复制到存档数据库的任务应在凌晨 2:00 运行,在此任务之后将调用清理作业。因此,由于最短保留时间,清理作业应删除所有 CDC 记录。保留时间到底过了?
我只是想看看当我在工作中再次设置时间表时发生了什么,例如 CDC 的一般用途。时间过去后,我检查了 CDC 表,结果发现它也只删除了最旧的记录。那么我做错了什么?
我做了一个解决方法,我做了一个新作业,任务是删除 CDC 表中的所有记录(并禁用整个默认的 CDC 清理作业)。这会更好,因为它可以删除所有内容,但这让我很困扰,因为我想使用原始的清理工作,并且我认为它应该能够以我想要的方式工作。
谢谢,
金
【问题讨论】:
-
典型的 CDC 工作流程是“处理我之前未处理的任何 CDC 数据”,这需要跟踪您为每个表处理的最后一个 LSN。您还将保留时间设置为远远超过您的处理节奏(即,如果您每天处理一次,您会将保留时间设置为 3 天或其他时间),以便如果出现问题,您有时间在数据被清除之前做出反应。然后你就让系统来处理它。也就是说,在 1 分钟的边缘情况下会出现奇怪的行为,我并不感到惊讶。如果您将其设置为 1 小时并安排它会发生什么?
-
谢谢!我将保留时间设置为 1 小时并安排了它。我更改了 2 条记录,几分钟后又更改了一条记录。当计划+保留时间到期时,我看到它只删除了我最初更改的 2 条记录中的 1 条。我再次设置了另一个时间表,然后它删除了这 2 条记录中的第 2 条记录。还剩下另一条记录。所以它仍然一次删除一条记录。应该超过一小时吧?问题是我想在同一天晚上删除 CDC 记录。就像 SSIS 任务应该在午夜左右复制所有记录,并且在第二天早上之前我要清除。
-
P.S.你能解释一下(也许是小例子)你的第一句话是什么意思。我不确定我是否理解正确。 “典型的 CDC 工作流程是“处理我之前未处理的任何 CDC 数据”,这需要跟踪您为每个表处理的最后一个 LSN。”
-
您不应直接访问捕获表,而应通过设置 cdc 时创建的函数获取 CDC 数据。具体来说,cdc.fn_cdc_get_all_changes_
或 cdc.fn_cdc_get_net_changes_ 。通过管理每次运行时要处理的 LSN 范围,您可以确保每行只处理一次。使用您当前的方案,您可能会丢失一些(如果在您启动 ETL 和删除 CDC 数据之间发生更改)。当您使用这些功能时,您不必担心什么时候会被删除。
标签: sql-server ssis jobs cdc change-data-capture