首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Server对LSN使用两种不同的数据类型?

为什么Server对LSN使用两种不同的数据类型?
EN

Database Administration用户
提问于 2023-05-05 17:18:13
回答 1查看 57关注 0票数 2

我在Server文档中注意到,日志序列号(LSNs)有时被描述为数字(25,0),而其他时候则被描述为二进制(10)。为什么LSNs使用两种不同的数据类型?我应该什么时候使用每一种类型?

https://learn.microsoft.com/en-us/sql/relational-databases/backup-restore/recover-to-a-log-sequence-number-sql-server?view=sql-server-ver16

LSNs是数据类型数值(25,0)的值。算术运算(例如加法或减法)是没有意义的,不能与LSNs一起使用。

https://learn.microsoft.com/en-us/sql/relational-databases/system-tables/cdc-lsn-time-mapping-transact-sql?view=sql-server-ver16

start_lsn二进制(10)

EN

回答 1

Database Administration用户

回答已采纳

发布于 2023-05-06 12:40:47

正如1月1日、2000年和2000-01-01是同一日期的两种不同的表示形式,因此根据LSN的消费方式,LSN有不同的表示形式。

我有一个名为Sandbox的测试数据库。我可以使用DBCC页面查看文件1 (参考文献)第9页上的内部元数据。

代码语言:javascript
复制
dbcc traceon(3604);
dbcc page('Sandbox', 1, 9, 3);

这表明数据库是在某个LSN上备份的。

代码语言:javascript
复制
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。

代码语言:javascript
复制
select database_backup_lsn
from msdb..backupset
where database_name = 'Sandbox'

database_backup_lsn
-------------------
43000002405900073

您会注意到,这个数字与从引导页中提取的数字相同,其中的零填充和连接部分。

因此,您应该使用与您正在读取的源对应的数据类型。

这里有一个方便的脚本这里来完成这个翻译。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/326796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档