T-SQL 使用更改数据捕获在特定时间捕获 A Table 的最小日志序列号

T-SQL Capture Minimum Log Sequence Number of A Table At A Specific Time Using Change Data Capture

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

第一次查询CDC时,我传入了sys.fn_cdc_get_min_lsn('dbo_t1') ( and sys.fn_cdc_get_min_lsn('dbo_t2') ) as @from_lsn for 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,特别是 下一个 VALID 数字大于前一个捕获那些特定表的最大 lsn(不能使用与以前相同的最小 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,当我第二次查询T2时需要传入12 @from_lsn.

使用sys.fn_cdc_increment_lsn (last_to_lsn_value)。这将为您提供序列中的下一个 lsn。 lsn 是否会对您的 table 进行任何交易并不重要。我可能会也可能不会。但是您想要从该 lsn 到 tables 的高水位线的所有更改。

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

这是我目前使用的代码。它使用 fn_cdc_increment_lsn() 根据之前的 运行:

找到下一个 lsn 值
DECLARE @last_known_lsn binary(10), @to_lsn binary(10), @from_lsn binary(10)
SET @last_known_lsn = 0x0000011D00000B080001; -- the @to_lsn value from last run
SET @from_lsn = sys.fn_cdc_increment_lsn(@last_known_lsn);
SET @to_lsn = sys.fn_cdc_get_max_lsn();
SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_customers (@from_lsn, @to_lsn, N'all');