我在Server文档中注意到,日志序列号(LSNs)有时被描述为数字(25,0),而其他时候则被描述为二进制(10)。为什么LSNs使用两种不同的数据类型?我应该什么时候使用每一种类型?
LSNs是数据类型数值(25,0)的值。算术运算(例如加法或减法)是没有意义的,不能与LSNs一起使用。
start_lsn二进制(10)
发布于 2023-05-06 12:40:47
正如1月1日、2000年和2000-01-01是同一日期的两种不同的表示形式,因此根据LSN的消费方式,LSN有不同的表示形式。
我有一个名为Sandbox的测试数据库。我可以使用DBCC页面查看文件1 (参考文献)第9页上的内部元数据。
dbcc traceon(3604);
dbcc page('Sandbox', 1, 9, 3);这表明数据库是在某个LSN上备份的。
dbi_dbbackupLSN = 43:24059:73 (0x0000002b:00005dfb:0049)LSN以十六进制和等效的十进制表示形式显示。例如,0x2b(十六进制)=43(小数)。因此我们可以推断,在内部,LSNs作为整数值存储在一个三部分结构中。如果我们数字节,忽略标点符号,我们看到它需要10个字节。这很可能是CDC实施过程中出现的形式。
我们可以将这些部分中的每一部分转换为它们的最大十六进制值,并将它们转换为整数等效值。
0 0xffffffff = 4294967295 (10位数)
0 0xffff = 65535 (5位数)
如果我们将它们结合起来,我们就需要一个10+10+5 = 25位的总长度来表示相同的十进制值。这是在文档功能中更常用的格式。为了确认,我们可以使用msdb查看相同的备份LSN。
select database_backup_lsn
from msdb..backupset
where database_name = 'Sandbox'
database_backup_lsn
-------------------
43000002405900073您会注意到,这个数字与从引导页中提取的数字相同,其中的零填充和连接部分。
因此,您应该使用与您正在读取的源对应的数据类型。
这里有一个方便的脚本这里来完成这个翻译。
https://dba.stackexchange.com/questions/326796
复制相似问题