【问题标题】:T-SQL Capture Minimum Log Sequence Number of A Table At A Specific Time Using Change Data CaptureT-SQL 使用变更数据捕获在特定时间捕获表的最小日志序列号
【发布时间】:2019-06-06 22:54:19
【问题描述】:

我有两张桌子,分别叫它们dbo.T1dbo.T2。我想使用 CDC 每隔几个小时捕获一次增量。

第一次查询 CDC 时,我将 sys.fn_cdc_get_min_lsn('dbo_t1') ( 和 sys.fn_cdc_get_min_lsn('dbo_t2') ) 作为 @from_lsn 传入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,具体是 next VALID number 大于上一个捕获的 max lsn FOR THOSE SPECIFIC TABLES(不能使用与以前相同的最小 fx,因为我想要 delta在最后一次捕获之后)。

例子:

第一次: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 作为 min 传递,因为 CDC 由于那些捕获的实例中的值无效而引发错误。基本上,当我第二次以@from_lsn 查询 T2 时,我需要在查询 T1 时传入 14 和 12。

【问题讨论】:

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


    【解决方案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

    【讨论】:

      【解决方案2】:

      这是我目前正在使用的代码。它使用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');
      

      【讨论】:

      • 感谢马丁的建议。我不记得我是如何做到这一点的,但有一天我会挖掘代码并检查一下。干杯!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      相关资源
      最近更新 更多