SQL Server中的LSN是什么意思?

18
LSN是什么意思?我知道它是二进制类型,长度为10字节,并对应于事务在数据库中发生的时间。但这是否是以一种高精度的日期时间值存储在某种有效的二进制格式中,或者是日期时间和其他内容的函数(例如在同一毫秒内发生的事务的序列号)?我进行了很多搜索,但找不到一个好的答案。
有人能用公式或函数来解释如何从日期时间或其他内容中推导LSN吗?
4个回答

21
在SQL Server中,每个记录都有一个独特的日志序列号(LSN)来进行标识。LSN是有序排列的,如果LSN2大于LSN1,则指向由LSN2所述的日志记录所描述的更改发生在由LSN1所述的日志记录之后。
来源:这里
你不需要关心这些如何生成。

Mitch,在发布这里之前我确实查看了MSDN。我想要的是它是如何制作的,因为这对我的特定应用程序非常重要。感谢您的时间。 - Faiz
1
如果这对你的应用程序很重要,我只能假设你正在编写某种低级别的恢复实用程序?如果不是,你就不需要知道它们是如何生成的。它可能会改变(不太可能,但没有阻止微软,因为它不是一个公开的接口)。 - Mitch Wheat
我正在尝试在ETL中使用这个来进行增量抽取的窗口化操作,而不是用于还原工具。我想确保在窗口化过程中使用LSN是安全的。请参阅我的其他问题[http://stackoverflow.com/questions/1137283/in-sql-server-cdc-with-ssis-which-data-should-be-stored-for-windowing-lsn-or-da/1137329#1137329]。 - Faiz
如果我从虚拟机快照中恢复数据库并执行相同的事务,那么生成/递增的“新” LSN 是否与旧的相同? - Prashanth Subramanian
我建议您提出一个新问题。 - Mitch Wheat

8
首先,对于回复已经无人问津的帖子表示抱歉。我在搜索基于 LSN 的其他操作时进入了这个主题。
LSN 只是一个顺序编号,如所述,它由三个十六进制部分(如00000016:0000003c:0001)组成,这些部分如下:
- 第一部分是VLF:虚拟日志文件 - 第二/中间部分是Offset:指向VLF的偏移量 - 最后/第三部分是基于偏移量跟踪的日志桶/块内的插槽号码
通常,任何数据库操作以及事务的开始/结束都会被存储,并且事务的每个操作(显然包括开始和提交操作)都会按顺序获取 LSN。这些与任何时间戳无关,但可以基于 sys 函数映射时间戳。 @max 已经对此进行了回复。
任何针对事务的提交操作都会强制切换到新的日志块,并且中间部分将增加,否则最后一部分将根据 VLF 的大小而增加。

@Faiz 请参考此链接。它提供了关于LSN的深入解释。https://learn.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-log-architecture-and-management-guide?view=sql-server-ver15 - S.P.

6
这是一个递增序列(1、2、3、4……),而不是日期时间值。根据Microsoft文档的说明:
“日志序列号(LSN)值是一个三部分的、唯一递增的值。它用于维护数据库事务日志记录的顺序。这使得SQL Server能够维护ACID属性并执行适当的恢复操作。”

好的。那么这是如何映射到日期时间的呢?是这样的,当发生DML时,LSN会递增,然后将日期时间值与LSN一起存储在映射表中吗? - Faiz
LSN和任何日期之间没有映射关系。LSN用于对所有事务进行全局排序。正如下面的Auassnoi所指出的,当您进行备份时会生成一个LSN。但那是唯一的一个。 - Thomas Jones-Low
我看到了你在上面给Mitch Wheat的评论。我建议生成一个事务(将日期插入应用程序表),然后将其用作您的LSN,以便进行before/after/delta操作。 - Thomas Jones-Low
1
@ThomasJones-Low,看起来可以使用sys.fn_cdc_map_lsn_to_time将LSN映射到DateTime,但需要启用CDC(https://dev59.com/KJDea4cB1Zd3GeqPivKz)。 - crokusek

1

没有确定的方法来派生它,但您可以从备份所在的机器上的 msdb.dbo.backupset 猜测出来:

SELECT  last_lsn
FROM    msdb.dbo.backupset
WHERE   backup_start_date = @backup_date

当然,这并不精确也不可靠。


1
sys.fn_cdc_map_lsn_to_time() 用于从 LSN 获取日期 sys.fn_cdc_map_time_to_lsn() 用于从日期和“关系运算符”获取 LSN(s) - max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接