对于SQL Server中的数据库或表,日志序列号(LSN)是唯一的吗?

时间:2015-03-10 13:49:55

标签: sql-server change-data-capture

我正在使用SQL CDC来跟踪SQL Server中多个表的更改。我想以正确的顺序报告这些变化,每个我都有一个从每个CDC表中收集数据的程序。但我想确保以正确的顺序报告发生在这些表中的所有更改。我可以依靠LSN获得正确的序列吗?

4 个答案:

答案 0 :(得分:2)

在数据库中,LSN在该数据库中的所有表中都是独一无二的。

答案 1 :(得分:1)

在大多数情况下,LSN值在所有表中都是唯一的,但我发现一个LSN值属于40个表中的更改的实例。我不知道与这些更改相关的SQL脚本,但我知道所有操作都是'INSERT'。

不确定是否是错误。 CDC文件很差,仅涵盖基础知识。没有多少用户知道CDC捕获过程有很多错误由MS确认SQL 2014和SQL 2016年(我们有公开案例)。

所以我不会依赖文档。在某些情况下可能是错误的。最好实施更多检查并使用大量不同的变化组合对其进行测试。

答案 2 :(得分:1)

LSN编号对于给定的事务是唯一的,但不是全局唯一的。如果在同一事务中有多个记录,则它们将在cdc中共享相同的__ $ start_lsn值。如果你想要正确的操作顺序,你需要按__ $ start_lsn,__ $ seqval,然后__ $ operation进行排序。 __ $ seqval表示包装事务中单个操作的id。

例如,我在dbo架构中有一个名为foo的表。它有一列y。如果我运行这个陈述:

INSERT INTO dbo.foo VALUES (1); 
INSERT INTO dbo.foo VALUES (2);

然后我将在cdc中看到两个单独的LSN值,因为它们位于两个单独的事务中。如果我运行这个:

BEGIN TRAN
INSERT INTO dbo.foo VALUES (1);
INSERT INTO dbo.foo VALUES (2);
COMMIT TRAN

然后我将看到两个记录的一个LSN值,但它们将具有不同的__ $ seqval值,并且我的第一个记录的seqval将小于我的第二个记录的seqval。

答案 3 :(得分:0)

我也遇到了这种情况。根据我的经验,在您的第一个示例中,我了解到发生了2笔交易,因此您实际上将获得2个不同的LSN。在第二个示例中,您只有1个事务,内部有2个查询。由于CDC位于BEGIN和END TRAN中,因此CDC仅将其视为1个事务。我无法提供与您的链接,因为这是我的个人经历。