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

news2024/11/12 2:47:19

一:背景

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录--二叉树章节总结 Part II

代码随想录–二叉树章节总结 Part II 1.Leetcode222 求完全二叉树结点的个数 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达…

Python机器学习:特征变换

🌕 特征变换 特征变换主要就是针对一个特征,使用合适的方法,对数据的分布、尺度等进行变换,以满足建模时对数据的需求。 特征变换可分为数据的数据的无量纲化处理和数据特征变换。 🌗 数据的无量纲化处理 常用处理…

22.0:Codejock Suite Pro for ActiveX COM:Crack

从 Visual Basic 5.0 和 6.0 开始一直到当前版本的 Visual Studio 的大多数 ActiveX 容器。与 Visual Studio 无缝集成并包含我们所有 ActiveX COM 产品的评估版本。评估版不提供 OCX 文件的 Unicode 版本。 创建包含一整套高度可定制的用户界面组件的专业应用程序,…

Flink-FinkSQL基本操作(Table API、动态表、事件窗口、分组聚合开窗查询、联结查询)

11 Table API和SQL 11.1 快速上手 引入TableAPI的依赖 桥接器 <dependency><groupId>org.apache.flink</groupId> <artifactId>flink-table-api-java-bridge_${scala.binary.version}</artifactId><version>${flink.version}</vers…

12、常用插件

文章目录12、常用插件推荐1&#xff1a;Alibaba Java Coding Guidelines推荐2&#xff1a;jclasslib bytecode viewer推荐3&#xff1a;Translation推荐4&#xff1a;GenerateAllSetter推荐5&#xff1a;Rainbow Brackets推荐6&#xff1a;CodeGlance Pro推荐7&#xff1a;Stat…

7.bWAPP -- INSECURE DIRECT OBJECT REFERENCES

7.bWAPP – INSECURE DIRECT OBJECT REFERENCES 0x01、Insecure DOR (Change Secret) 同 XSS - Stored (Change Secret) Low 仔细观察页面, 发现隐藏一个input标签, 作用是输入用户名, 并且配合提交的修改密码, 完成修改用户密码的操作: 这里就可以利用该用户名input标签达…

如何带好一个团队?团队管理的要点有哪些?

想带好一个团队并不是这么容易&#xff0c;尤其是对于新晋升管理者来说更是难上加难。团队管理可以大大提高工作效率。那么&#xff0c;团队管理的要点是什么呢&#xff1f; 1、远景和目标 成员们先要有一个共同的目标&#xff0c;在此基础上还必须要有一个好的愿景&#xff0…

即时通讯系列---如何下手做技术方案设计

1. 引出主题 IM整体涉及的内容比较多, 做技术方案设计需要慎重, 可以先从功能列表以及核心case逐步的总结出技术方案 本文结构: 1. 查看功能列表 2. 核心case分析 3. 总结技术方案设计 2. 如何做技术方案设计 1. 查看功能列表 功能清单 一级分类 二级分类 三级分类…

TCP/UDP网络编程

目录 一、常见的客户端服务端模型 二、Socket套接字 1、概念 2、分类 a、流套接字 b、数据报套接字 c、原始套接字 三、UDP数据报套接字编程 四、TCP数据报套接字编程 一、常见的客户端服务端模型 客户端&#xff1a;用户使用的程序。 服务端&#xff1a;给用户提…

miracl编译及使用

文章目录Windows平台编译网址 https://miracl.com/https://github.com/miracl/MIRACL Windows平台编译 源码目录下新建文件夹ms32或ms64&#xff0c;把/lib/ms32doit.bat或ms64doit.bat分别拷进去。 把源码include和source目录所有文件拷贝进要编译的ms32或ms64&#xff0c…

【高阶数据结构】海量数据如何处理? (位图 布隆过滤器)

&#x1f308;欢迎来到高阶数据结构专栏~~位图 & 布隆过滤器 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff0…

模拟实现list / list迭代器

前言&#xff1a;学习C的STL&#xff0c;我们不仅仅要求自己能够熟练地使用各种接口&#xff0c;我们还必须要求自己了解一下其底层的实现方法&#xff0c;这样可以帮助我们写出比较高效的代码程序&#xff01; ⭐在本篇文章中&#xff0c;list的迭代器是重点&#xff0c;它不…

WSL2配置网络代理

注意&#xff1a;本文参考自文章&#xff1a;WSL2配置代理&#xff0c;是对原文的补充&#xff0c;使其适用于河对岸云服务代理。 1 开启Windows代理 1.1 开启代理软件的局域网访问权限 请注意&#xff1a;本文的WSL2代理配置&#xff0c;需要Windows的代理软件已经能够正常…

HTTPS详解及HTTPS实验

目录 HTTPS 一&#xff0c;https在参考模型中的位置 二&#xff0c;什么是HTTPS 三&#xff0c;什么是SSL 1&#xff0c;SSL 协议分为两层&#xff1a; 2&#xff0c;SSL 协议提供的服务&#xff1a; 四&#xff0c;HTTPS的加密方式 1&#xff0c;常见的加密算法 2&#xff0c;…

mysql知识点

目录 1.mysql聚合函数&#xff1a; 2.having&#xff08;用来过滤数据&#xff09;&#xff1a; HAVING 不能单独使用&#xff0c;必须要跟 GROUP BY 一起使用 WHERE 与 HAVING 的对比 3.升序和降序 4.等于 5.实战demo&#xff1a; 1.mysql聚合函数&#xff1a; 常用的聚…

codeforces签到题之div3

前言 第一次&#xff43;&#xff4f;&#xff44;&#xff45;&#xff46;&#xff4f;&#xff52;&#xff43;&#xff45;&#xff53;&#xff0c;发现几个问题&#xff1a; 1,不知道选&#xff4c;&#xff41;&#xff4e;&#xff47;&#xff55;&#xff41;&…

17正交距阵和Gram-Schmidt正交化

标准正交向量与正交矩阵 上一节介绍过的正交向量&#xff0c;通过一个式子进行回顾&#xff0c;设q是标准正交向量组中的任意向量&#xff0c;则 这很好地表现了标准正交向量组内各向量的性质&#xff1a; 不同向量之间相互垂直&#xff08;正交&#xff09;&#xff0c;向量…

Ribbon 负载均衡

介绍Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单的说&#xff0c;就…

屏幕录制软件推荐,分享这3款,简单好用

​网络上充斥着许多各种各样的屏幕录制软件&#xff0c;许多有选择困难的朋友可能会充满怀疑&#xff1a;哪个电脑屏幕录制软件很容易使用&#xff1f;屏幕录制软件推荐哪个比较好&#xff1f;别担心&#xff0c;今天&#xff0c;小编分享这这3个简单好用的屏幕录制软件&#x…

Day10 C++STL入门基础知识七——案例1【评委打分】

路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录1. 承接上文1. 案例描述2. 实现思路3. 亿点点分析3.1 创建选手类3.1.1 具体思路3.1.2 代码展示3.2 创建5名选手并对其姓名、平均分进行初始化3.2.1 具体思路① 创建vector容器② 创建一个creatPlayer()函数a.调用函数b. 初始…