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 中的物理偏移位置吧,要想获取物理偏移就要知道下面偏移值才可以。0x30 虚拟文件号的偏移值是多少 ?
要想知道这个信息,可以用 DBCC loginfo 命令,查看 FSeqNo 下的 StartOffset 偏移值即可,即 0n48 对应的 4071424 ,截图如下:
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 有一个深度的理解,对各种数据库事务日志暴涨的故障分析都会有一个很好的理论基础,后面我们再聊这些话题。
贪腐成风列宁时期令人惊异的腐败现象列宁时期,因为战争的需要,苏俄建立了高度集中的国家体制,这种体制后来严重助长了苏俄干部特权的滋长。而对于苏联后期的腐败现象,许多苏联史学家有一个固定印象,即苏联领导干部的腐化行为主
司马光涑水记闻125失信于民125杜杞诱杀宜州蛮杜杞在广南(两广地区)时,引诱宜州(广西)土著人数十人,让他们饮漫陀罗酒,待他们喝醉后杀了他们,写信给梁寔的父亲,把自己比作(马革裹尸的)马援,还说这还不足以建
论新疆地区白山派和黑山派的恩怨始末首先我们要清楚的是,虽然分为白山派和黑山派,但是他们都是属于伊斯兰苏菲派的。白山派的创始人是教主玛哈图木阿杂木的长子,而黑山派的创始人是阿杂木的幼子,可以说这是一个家族内部衍生出来
汉朝名将李陵为何要投降匈奴?只因一个误会导致!将军百战声名裂。向河梁回头万里,故人长绝。辛弃疾的词字字浸血,咏叹了汉代极其悲怆又极具争议的将领李陵,在援军被切断,军队被击败后,他的经历令人同情。因为一个误会导致他投降了匈奴,并
AI复原的清朝后宫,有花容月貌的格格公主,有霸气侧漏的慈禧太后AI修复技术是十分的强大的,可以将人们模糊的老照片给还原出原来的面貌,我们来看看AI修复清朝皇后嫔妃公主格格现代照片,最后AI复原后的慈禧太后,真是霸气侧漏寒气逼人。慈禧太后和众嫔
左宗棠雷霆手段收复西北,堪称史上最被低估之人左宗棠收复新新疆,绝对是屈辱昏聩的晚清最高光的时刻。如果没有左宗棠,中华大地将会损失约占版图六分之一的国土,物产丰富的塔里木准噶尔,苍茫巍峨的天山昆仑山,可能都会沦为异域。左宗棠几
中华上下五千年国人暴动!在成王康王统治的时期,周朝政局比较安定。后来,由于奴隶主贵族加重剥削,加上不断发动战争,平民和奴隶的不满情绪也随着增长。周朝的统治者为了镇压人民,采用十分严酷的刑罚。周穆王的时候,
如果朱高炽多活十年二十年,明朝历史会不会改写?明仁宗朱高炽(1378年8月16日1425年5月29日),明成祖朱棣长子,生母仁孝文皇后徐氏。明朝第四位皇帝,年号洪熙。朱高炽整整当了20年的太子,纵观整个中国历史,也是独树一帜。
武举法中的这一缺陷,凸显了明朝的政治形势武举法虽然为明王朝之后武举制度的进一步发展奠定了扎实的基础。但还是存在一定的缺陷,具体有如下体现武举考试开设的时间没有固定下来。武举法中虽然对武举考试的内容录取的基本标准俸禄的发放
茶马古道今犹在,崇山峻岭觅过往浅析明朝茶马互市制度阅读此文前,麻烦您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。引言我国古代的茶马互市制度起于唐宋,兴于明朝,而后在清朝衰落。茶马互市不仅仅只是一种
景区商场人气渐旺!西安曲江新区烟火气回归最近几天,景区的人流量肉眼可见地增加了这段时间阳康市民重新走出家门先曲江新区的商场景区街道上也逐渐恢复了往日的人气今天,小编和同事们为大家探寻正在恢复的烟火气今日阳光明媚,各景区人