首页 > 数据库 >SQLSERVER 事务日志的 LSN 到底是什么?

SQLSERVER 事务日志的 LSN 到底是什么?

时间:2023-01-29 10:46:58浏览次数:72  
标签:事务 ldf LSN SQLSERVER 偏移 MyLSN 日志

SQLSERVER 事务日志的 LSN 到底是什么?

 

一:背景

1. 讲故事

大家都知道数据库应用程序 它天生需要围绕着数据文件打转,诸如包含数据的 .mdf,事务日志的 .ldf,很多时候深入了解这两类文件的合成原理,差不多对数据库就能理解一半了,关于 .mdf 的合成前面的文章已经有所介绍,这篇我们来聊一下 .ldf 的一些内部知识,比如 LSN

二:对 LSN 的理解

1. 什么是 LSN

如果大家玩过 SQLSERVER 的发布订阅或者 AlwaysOn 或多或少都见过 LSN,比如下面的格式: 00000030:00018090:0002 ,这一串编号到底是什么意思呢?本质上指示的是 .ldf 文件的某一个物理位置上的偏移,画个图大概如下:

从图中可以看到其实是由 虚拟文件号:日志段起始扇区编号:槽号编号 三部分组成,要了解这三部分就需要明白 .ldf 文件是如何进行逻辑划分的,画个简图如下:

通过上面的图很容易就能明白其中的逻辑关系,事务日志文件被划分成了多个 虚拟文件,虚拟文件又划分成了多个 日志段,日志段又划分成了多个 扇区,日志段中日志记录位置存储在 槽号 中,有了这些理论基础,接下来用一个案例来加深大家的理解吧。

2. 一个案例演示

新建一个 MyLSN 数据库,再创建一个 test 表,插入 3w 条记录,sql如下:


CREATE DATABASE MyLSN
GO
USE MyLSN
GO
CREATE TABLE test(a INT IDENTITY, b CHAR(10) DEFAULT 'aaaaaaaaaa')

SET NOCOUNT ON
INSERT INTO test (b) DEFAULT VALUES
GO 30000
SET NOCOUNT OFF

接下来通过 fn_dblog 来查询和 dbo.test 表相关的事务日志记录。


SELECT [Current LSN],
       Operation,
       Context,
	   AllocUnitName,
       [RowLog Contents 0],
       [Log Record],
       [Log Record Length]
FROM fn_dblog(NULL, NULL)
WHERE AllocUnitName LIKE '%test%';

从图中可以看到这是一个 INSERT 的事务日志记录,这里就拿编号 00000030:00000db0:0002 去定位 .ldf 中的物理偏移位置吧,要想获取物理偏移就要知道下面偏移值才可以。

  1. 0x30 虚拟文件号的偏移值是多少 ?

要想知道这个信息,可以用 DBCC loginfo 命令,查看 FSeqNo下的 StartOffset 偏移值即可,即 0n48 对应的 4071424 ,截图如下:

  1. 0xdb0 扇区号的偏移是多少?

大家都知道磁盘的扇区是 512byte,sqlserver 为了更好的写入磁盘,也用了 512byte 这个粒度,所以偏移值就是 512 * 0xdb0

综合上面就能定位到日志段的物理偏移值为:


lkd> ?0n4071424 + (0n3504*0n512)
Evaluate expression: 5865472 = 00000000`00598000

接下来用 WinHex 来定位 MyLSN_log.ldf 文件偏移 00598000 的位置,定位之前先将数据库离线。

ALTER DATABASE MyLSN SET OFFLINE

前面的 0x0003 表示该日志段只有 3 条记录,后面的 0x019E 表示该日志段的大小为 414byte,接下来就是槽号了,槽号位置的物理偏移计算规则如下:


lkd> ? 00598000 + 019E - 1
Evaluate expression: 5865885 = 00000000`0059819d

从图中可以看到,slot2 的偏移值为 00C8,即物理偏移值为 005980c8 。


lkd> ? 00598000 + 00C8
Evaluate expression: 5865672 = 00000000`005980c8

从上面框出的内容可以轻松的看到,事务日志中记录了 Insert 的 aaaaaaaaaa 值,太棒了,起始就是 fn_dblog 查出来的 Log Record 值。

三:总结

对 LSN 有一个深度的理解,对各种数据库事务日志暴涨的故障分析都会有一个很好的理论基础,后面我们再聊这些话题。

标签:事务,ldf,LSN,SQLSERVER,偏移,MyLSN,日志
From: https://www.cnblogs.com/sexintercourse/p/17071972.html

相关文章

  • 2.日志
    1.一个好的项目应该有一个好的日志框架,保证服务正常运行  思路 我认为一个内嵌的日志应该是要能支持 Microsoft.Extensions.Logging微软插件的服务。   所以......
  • 温习日志-8
    温习日志——2023年1月28日下午学习内容Sets通过newSet(可迭代对象)创建setset集合会将数组中重复项删除,保证都是唯一值set接受可迭代对象,就算是字符串也行set方......
  • 记录解决方案(sqlserver篇)
    一个月的补卡次数不超过三次(即统计一个月内某人的补卡次数)表结构是某人一天内的四次打卡状态,这样是统计当月补卡的天数了(错误)selectcount(*)from[Proc_HR_Punch]wher......
  • linux 导出日志 命令
    1、连接上相应的linux主机,进入到等待输入shell指令的linux命令行状态下。  2、在命令行下输入shell指令:sz/var/log/boot.log,此时会弹出下载位置选择。3、点击确定......
  • java书写并建立txt日志文件
    /*建立txt,并写入日志文件*/publicstaticvoidlogWrite(Stringdata,Stringname){//System.out.println("写入"+name+"开始");Calend......
  • 【如何提高IT运维效率】深度解读京东云基于NLP的运维日志异常检测AIOps落地实践
    作者:京东科技 张宪波、张静、李东江基于NLP技术对运维日志聚类,从日志角度快速发现线上业务问题日志在IT行业中被广泛使用,日志的异常检测对于识别系统的运行状态至关重......
  • 【如何提高IT运维效率】深度解读京东云基于自然语言处理的运维日志异常检测AIOps落地
    作者:京东科技 张宪波、张静、李东江基于NLP技术对运维日志聚类,从日志角度快速发现线上业务问题日志在IT行业中被广泛使用,日志的异常检测对于识别系统的运行状态至关重要。......
  • CentOS下的日志切割
    转: CentOS下的日志切割 在Linux下,日志会不停的增长,为了防止日志文件过大,导致我们无法在日志中快速找到想要的信息,我们会定时对日志文件进行切割。在这里我将......
  • SQLSERVER 事务日志的 LSN 到底是什么?
    一:背景1.讲故事大家都知道数据库应用程序它天生需要围绕着数据文件打转,诸如包含数据的.mdf,事务日志的.ldf,很多时候深入了解这两类文件的合成原理,差不多对数据库就能......
  • (转)SQLServer全局变量
    @@CONNECTIONS:返回自上次启动SQLServer以来连接或试图连接的次数,用其可让管理人员方便地了解今天所有试图连接服务器的次数。@@CPU_BUSY:返回自SQLServer最近一次启......