【问题标题】:What does LSN mean in SQL Server?SQL Server 中的 LSN 是什么意思?
【发布时间】:2009-07-17 13:02:19
【问题描述】:

日志序列号是什么意思?我知道它是二进制类型,长度为 10 字节,它对应于事务在 DB 中发生的时间。但这是以某种有效的二进制格式存储的高精度日期时间值,还是日期时间和其他东西的函数(例如在同一毫秒发生的事务的序列号)。我做了很多搜索,但找不到一个好的答案。

任何人都可以用用于从日期时间或任何东西中导出 LSN 的公式或函数来解释。

【问题讨论】:

    标签: sql sql-server architecture logging cdc


    【解决方案1】:

    SQL Server 中的每条记录 事务日志是唯一标识的 通过日志序列号 (LSN)。 LSN 被排序使得如果 LSN2 是 大于 LSN1,变化 由引用的日志记录描述 到由 LSN2 发生变化后 由日志记录 LSN 描述。

    来自here

    您不应该关心这些是如何生成的。

    【讨论】:

    • Mitch,我在发帖之前确实查看了 MSDN。我正在寻找的是它是如何制作的。就像它对我的特定应用程序很重要一样。感谢您的宝贵时间。
    • 如果它对您的应用程序很重要,我只能假设您正在编写某种低级恢复实用程序?如果没有,您不需要知道这些是如何生成的。它可能会改变(不太可能,但没有什么可以阻止 MS,因为它不是已发布的界面)。
    • 我正在尝试将其用于 ETL 中的增量提取窗口。不适用于还原实用程序。我想确保将 LSN 用于窗口目的是安全的。请参阅我的其他问题 [stackoverflow.com/questions/1137283/…
    • 如果我从 VM 快照还原数据库并在其上执行相同的事务,生成/增加的“新”LSN 是否与旧 LSN 相同?
    • 我建议提出一个新问题
    【解决方案2】:

    这是一个递增序列(1,2,3,4,...),而不是日期时间值。来自Microsoft documentation

    日志序列号 (LSN) 值为 三部分,唯一递增 价值。它用于维护 事务日志的顺序 数据库中的记录。这允许 SQL Server 维护 ACID 属性并执行适当的 恢复操作。

    【讨论】:

    • 好的。那么这是如何映射到日期时间的呢?是不是当 DML 发生时,LSN 会增加,然后将日期时间值与 LSN 一起存储在映射表中?
    • LSN 和任何日期之间没有映射关系。 LSN 用于对所有事务进行全局排序。正如下面的 Auassnoi 指出的那样,当您进行备份时会生成一个 LNS。但这是唯一的一个。
    • 我在上面阅读了您对 Mitch Wheat 的评论。我建议生成一个事务(将日期插入应用程序表),然后将其用作您的 LSN 用于之前/之后/增量目的。
    • @ThomasJones-Low,似乎可以使用sys.fn_cdc_map_lsn_to_time 获得从 LSN 到 DateTime 的映射,但它需要 CDC to be enabled
    【解决方案3】:

    首先,很抱歉回复死帖。我是在搜索其他基于 LSN 的操作时来到这个线程的。 LSN 只不过是序列号,因为它指定 - 以三个十六进制部分生成的日志序列号,如 00000016:0000003c:0001,这些部分如下:

    • 第一部分是 VLF:虚拟日志文件
    • 第二/中间部分是 OffSet:偏移到 VLF
    • Last/Third 部分是基于偏移量跟踪的 log/bucket 块内的 Slot Number

    通常,任何数据库操作以及事务的开始/结束都会被存储,并且事务的每个操作,显然,开始和提交操作都会按顺序获得 LSN。这些与任何时间戳无关,但可以基于 sys 函数与时间戳映射。 @max 已经回复了。

    对事务的任何提交操作,强制切换到新的日志块和中间部分都会增加,否则最后一部分会根据VLF的大小增加。

    【讨论】:

    【解决方案4】:

    没有保证可以派生它的方法,但您可以在您进行备份的机器上从msdb.dbo.backupset 猜测它:

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

    这当然不准确也不可靠。

    【讨论】:

    • sys.fn_cdc_map_lsn_to_time() 从 lsn 获取日期 sys.fn_cdc_map_time_to_lsn() 从日期和“关系运算符”获取 lsn(s)
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多