我在 SQL Server 文档中注意到,日志序列号 (LSN) 有时被描述为数字 (25,0),有时被描述为二进制 (10)。为什么 LSN 使用两种不同的数据类型?我什么时候应该使用每种类型?
LSN 是数据类型 numeric(25,0) 的值。算术运算(例如,加法或减法)没有意义,不得与 LSN 一起使用。
start_lsn 二进制文件(10)
我在 SQL Server 文档中注意到,日志序列号 (LSN) 有时被描述为数字 (25,0),有时被描述为二进制 (10)。为什么 LSN 使用两种不同的数据类型?我什么时候应该使用每种类型?
LSN 是数据类型 numeric(25,0) 的值。算术运算(例如,加法或减法)没有意义,不得与 LSN 一起使用。
start_lsn 二进制文件(10)
就像 2000 年 1 月 1 日和 2000-01-01 是同一日期的两种不同表示形式,因此根据使用方式的不同,LSN 的表示形式也不同。
我有一个名为 Sandbox 的测试数据库。我可以使用 DBCC PAGE查看文件 1(参考)第 9 页上保存的内部元数据。
这说明数据库是在某个LSN备份的。
LSN 以十六进制和等效的十进制表示形式显示。例如,0x2b(十六进制)= 43(十进制)。因此我们可以推断,在内部,LSN 作为类似整数的值存储在一个由三部分组成的结构中。如果我们计算忽略标点符号的字节数,我们会发现它需要 10 个字节。这很可能是 CDC 实施中出现的格式。
我们可以获取这些部分中的每一个并将它们的最大十六进制值转换为等效的整数。
0xffffffff = 4294967295(10 位)
0xffff = 65535(5 位)
如果我们将这些结合起来,我们会发现我们需要 10+10+5 = 25 位的总长度来表示相同的十进制值。这是记录功能中更常用的格式。为了确认,我们可以使用msdb查看相同的备份 LSN 。
您会注意到这个数字与从引导页面中提取的数字相同,其中的部分用零填充并连接起来。
因此,您应该使用与您正在阅读的来源相对应的数据类型。
这里有一个方便的花花公子脚本来进行这种翻译。