使用变更数据捕获,在特定时间T-SQL捕获表的最小日志序列号

时间:2019-06-06 22:54:19

标签: sql sql-server sql-server-2016 cdc change-data-capture

我有两个表,分别称为dbo.T1dbo.T2。我想使用CDC每隔几个小时捕获一次增量。

我第一次查询CDC时,我以{strong> @from_lsn 的身份传入sys.fn_cdc_get_min_lsn('dbo_t1')(和sys.fn_cdc_get_min_lsn('dbo_t2')) >用于 cdc.fn_cdc_get_net_changes_ dbo_t1(和cdc.fn_cdc_get_net_changes_dbo_t2)函数。

另外,sys.fn_cdc_get_max_lsn() @to_lsn

到目前为止很好。

现在,下次运行查询时,我只想捕获自上次捕获以来的增量。我仍然可以调用sys.fn_cdc_get_max_lsn()来获取@to_lsn,但是我需要为这些表专门获取@from_lsn,这些表下一个有效数字大于先前捕获的针对特定表的最大lsn (不能使用与以前相同的min fx,因为我想要增量最后一次捕获后)。

示例:

第一次:T1 @from_lsn = 1(让我们使用int使其简单),T2 @from_lsn =5。全局@to_lsn = 10

第二次:T1 @from_lsn = 14 和T2 @from_lsn = 12 。全局@to_lsn = 20

如何获取第二次以上捕获的@from_lsn?我不能以最小的形式传入@to_lsn,因为CDC会由于捕获的实例中的无效值而引发错误。基本上,我需要在查询T1时传递14和在第二次以@from_lsn查询T2时传递12。

1 个答案:

答案 0 :(得分:1)

使用sys.fn_cdc_increment_lsn(last_to_lsn_value)。这将使您获得序列中的下一个lsn。 lsn是否对您的表进行任何事务都无关紧要。我可能会也可能不会。但是,您希望从lsn到表的高水位线都进行更改。

请参阅 https://docs.microsoft.com/en-us/sql/relational-databases/system-functions/sys-fn-cdc-increment-lsn-transact-sql?view=sql-server-ver15