一:背景1。讲故事 大家都知道数据库应用程序它天生需要围绕着数据文件打转,诸如包含数据的。mdf,事务日志的。ldf,很多时候深入了解这两类文件的合成原理,差不多对数据库就能理解一半了,关于。mdf的合成前面的文章已经有所介绍,这篇我们来聊一下。ldf的一些内部知识,比如LSN。二:对LSN的理解1。什么是LSN 如果大家玩过SQLSERVER的发布订阅或者AlwaysOn或多或少都见过LSN,比如下面的格式:00000030:00018090:0002,这一串编号到底是什么意思呢?本质上指示的是。ldf文件的某一个物理位置上的偏移,画个图大概如下: 从图中可以看到其实是由虚拟文件号:日志段起始扇区编号:槽号编号三部分组成,要了解这三部分就需要明白。ldf文件是如何进行逻辑划分的,画个简图如下: 通过上面的图很容易就能明白其中的逻辑关系,事务日志文件被划分成了多个虚拟文件,虚拟文件又划分成了多个日志段,日志段又划分成了多个扇区,日志段中日志记录位置存储在槽号中,有了这些理论基础,接下来用一个案例来加深大家的理解吧。2。一个案例演示 新建一个MyLSN数据库,再创建一个test表,插入3w条记录,sql如下: spanstylecolor:a626a4;lineheight:26CREATEspanspanstylecolor:a626a4;lineheight:26DATABASEspanMyLSN spanstylecolor:a626a4;lineheight:26GOspan spanstylecolor:a626a4;lineheight:26USEspanMyLSN spanstylecolor:a626a4;lineheight:26GOspan spanstylecolor:a626a4;lineheight:26CREATEspanspanstylecolor:a626a4;lineheight:26TABLEspanspanstylecolor:a626a4;lineheight:26testspan(aspanstylecolor:c18401;lineheight:26INTspanspanstylecolor:a626a4;lineheight:26IDENTITYspan,bspanstylecolor:c18401;lineheight:26CHARspan(spanstylecolor:986801;lineheight:2610span)spanstylecolor:a626a4;lineheight:26DEFAULTspanspanstylecolor:50a14f;lineheight:26aaaaaaaaaaspan) spanstylecolor:a626a4;lineheight:26SETspanNOCOUNTspanstylecolor:a626a4;lineheight:26ONspan spanstylecolor:a626a4;lineheight:26INSERTspanspanstylecolor:a626a4;lineheight:26INTOspanspanstylecolor:a626a4;lineheight:26testspan(b)spanstylecolor:a626a4;lineheight:26DEFAULTspanspanstylecolor:a626a4;lineheight:26VALUESspan spanstylecolor:a626a4;lineheight:26GOspanspanstylecolor:986801;lineheight:2630000span spanstylecolor:a626a4;lineheight:26SETspanNOCOUNTspanstylecolor:a626a4;lineheight:26OFFspan 接下来通过fndblog来查询和dbo。test表相关的事务日志记录。 spanstylecolor:a626a4;lineheight:26SELECTspan〔spanstylecolor:a626a4;lineheight:26CurrentspanLSN〕, Operation, spanstylecolor:a626a4;lineheight:26Contextspan, AllocUnitName, 〔RowLogspanstylecolor:a626a4;lineheight:26Contentsspanspanstylecolor:986801;lineheight:260span〕, 〔spanstylecolor:a626a4;lineheight:26Logspanspanstylecolor:c18401;lineheight:26Recordspan〕, 〔spanstylecolor:a626a4;lineheight:26Logspanspanstylecolor:c18401;lineheight:26Recordspanspanstylecolor:a626a4;lineheight:26Lengthspan〕 spanstylecolor:a626a4;lineheight:26FROMspanfndblog(spanstylecolor:0184lineheight:26span,spanstylecolor:0184lineheight:26span) spanstylecolor:a626a4;lineheight:26WHEREspanAllocUnitNamespanstylecolor:a626a4;lineheight:26LIKEspanspanstylecolor:50a14f;lineheight:26 从图中可以看到这是一个INSERT的事务日志记录,这里就拿编号00000030:00000db0:0002去定位。ldf中的物理偏移位置吧,要想获取物理偏移就要知道下面偏移值才可以。0x30虚拟文件号的偏移值是多少? 要想知道这个信息,可以用DBCCloginfo命令,查看FSeqNo下的StartOffset偏移值即可,即0n48对应的4071424,截图如下:0xdb0扇区号的偏移是多少? 大家都知道磁盘的扇区是512byte,sqlserver为了更好的写入磁盘,也用了512byte这个粒度,所以偏移值就是5120xdb0。 综合上面就能定位到日志段的物理偏移值为: lkd?spanstylecolor:986801;lineheight:260spann4071424(spanstylecolor:986801;lineheight:260spann3504spanstylecolor:986801;lineheight:260spann512) Evaluateexpression:spanstylecolor:986801;lineheight:265865472spanspanstylecolor:986801;lineheight:2600000000spanspanstylecolor:986801;lineheight:2600598000span 接下来用WinHex来定位MyLSNlog。ldf文件偏移00598000的位置,定位之前先将数据库离线。spanstylecolor:a626a4;lineheight:26ALTERspanspanstylecolor:a626a4;lineheight:26DATABASEspanMyLSNspanstylecolor:a626a4;lineheight:26SETspanspanstylecolor:a626a4;lineheight:26OFFLINEspan 前面的0x0003表示该日志段只有3条记录,后面的0x019E表示该日志段的大小为414byte,接下来就是槽号了,槽号位置的物理偏移计算规则如下: lkd?spanstylecolor:986801;lineheight:2600598000spanspanstylecolor:986801;lineheight:26019spanEspanstylecolor:986801;lineheight:261span Evaluateexpression:spanstylecolor:986801;lineheight:265865885spanspanstylecolor:986801;lineheight:2600000000spanspanstylecolor:986801;lineheight:260059819spand 从图中可以看到,slot2的偏移值为00C8,即物理偏移值为005980c8。 lkd?spanstylecolor:986801;lineheight:2600598000spanspanstylecolor:986801;lineheight:2600spanC8 Evaluateexpression:spanstylecolor:986801;lineheight:265865672spanspanstylecolor:986801;lineheight:2600000000spanspanstylecolor:986801;lineheight:26005980spanc8 从上面框出的内容可以轻松的看到,事务日志中记录了Insert的aaaaaaaaaa值,太棒了,起始就是fndblog查出来的LogRecord值。三:总结 对LSN有一个深度的理解,对各种数据库事务日志暴涨的故障分析都会有一个很好的理论基础,后面我们再聊这些话题。 END 工作中的你,是否曾遇到。。。 1。sql语句性能差 2。数据库损坏 3。数据库CPU暴涨 4。数据库死锁 等急需解决的事件,全公司都指望着你能解决。。。危难时刻才能展现你的技术价值,作为专注于。NET高级调试的技术博主,欢迎微信搜索:一线码农聊技术,免费协助你分析,希望我能将你的踩坑经验分享给更多的人。