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 有一个深度的理解,对各种数据库事务日志暴涨的故障分析都会有一个很好的理论基础,后面我们再聊这些话题。
SQLSERVER 事务日志的 LSN 到底是什么?的更多相关文章
- (转)解释一下SQLSERVER事务日志记录
本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html 解释一下SQLSERVER事务日志记录 大家知道在完整恢 ...
- 解释一下SQLSERVER事务日志记录
解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log ...
- sqlserver 事务日志过大 收缩方法解决方案
sqlserver 事务日志过大,可能会导致备份失败或者数据库出现异常,所以要定期清除sqlserver 事务日志 建议:为了防止日志文件无限扩大,可以对日志文件作一些限制. 清除sqlserver事 ...
- sqlserver 事务日志已满解决方案
sqlserver 事务日志已满解决方案 可参考这篇博客: https://www.cnblogs.com/strayromeo/p/6961758.html 一.删除日志文件:(不建议) 二.手动收 ...
- SQL Server数据库事务日志序列号(LSN)介绍
原文:http://blog.csdn.net/tjvictor/article/details/5251463 日志序列编号(LSN)是事务日志里面每条记录的编号. 当你执行一次备份时,一些 ...
- SqlServer 事务日志传输
基本概念 可以使用日志传送将事务日志不间断地从一个数据库(主数据库)发送到另一个数据库(辅助数据库).不间断地备份主数据库中的事务日志,然后将它们复制并还原到辅助数据库,这将使辅助数据库与主数据库基本 ...
- 收缩sqlserver事务日志
若要允许 DBCC SHRINKFILE 命令收缩文件,首先需要通过将数据库恢复模式设置为 SIMPLE 来截断该文件. 示例,收缩数据库abce的事务日志 USE abce; GO -- Trunc ...
- sqlserver 事务日志
预写式日志(Write-Ahead Logging (WAL)) --在数据写入到数据库之前,先写入到日志. 1.”Begin Tran”记录 -> 缓冲区 2. 日志 ...
- SQLSERVER事务日志已满 the transaction log for database 'xx' is full
解决办法:清除日志 USE [master] GO ALTER DATABASE DNName SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE D ...
- (转)对SQLSERVER数据库事务日志的疑问
本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/06/10/3130856.html 对SQLSERVER数据库事务日志的疑问 摸不透SQLS ...
随机推荐
- 论文笔记 - GRAD-MATCH: A Gradient Matching Based Data Subset Selection For Efficient Learning
Analysis Coreset 是带有权重的数据子集,目的是在某个方面模拟完整数据的表现(例如损失函数的梯度,既可以是在训练数据上的损失,也可以是在验证数据上的损失): 给出优化目标的定义: $w^ ...
- 华为云 MRS 基于 Apache Hudi 极致查询优化的探索实践
背景 湖仓一体(LakeHouse)是一种新的开放式架构,它结合了数据湖和数据仓库的最佳元素,是当下大数据领域的重要发展方向. 华为云早在2020年就开始着手相关技术的预研,并落地在华为云 Fusio ...
- Educational Codeforces Round 130 (Rated for Div. 2) C. awoo's Favorite Problem
https://codeforc.es/contest/1697/problem/C 因为规则中,两种字符串变换都与'b'有关,所以我们根据b的位置来进行考虑: 先去掉所有的'b',如果两字符串不相等 ...
- redis的几个优化点
1. redis读写速度慢 可以将redis单实例改为redis集群 2. redis报OOM redis内存溢出,调大redis内存:增加redis.conf中的maxmemory 的值.如果red ...
- EntityFramework介绍
首先我们说明一下ORM是什么. 微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上.开发人员使用Linq语言,对数据库操作如同操作Object对象 一 ...
- 小程序基础之引用vant组件库
第一步:终端npm init -y 会生成一个pack.json文件.(初始化包管理,记录这个项目用的包.) 第二步:npm install 会生成一个 package-lock.json文件.(一个 ...
- 前端面试HTML和CSS总结,这一篇就够了!
一,面试基础 HTML和CSS ps:这俩面试答不上来的,基本就可以回去了,以下是HTML题,一般来说这地方不会出太多题,面试官也不愿意花太多时间在这上面. 1,HTML语义化,如何理解语义化? 让人 ...
- SQL-GROUP BY语句在MySQL中的一个错误使用被兼容的情况
首先创建数据库hncu,建立stud表格. 添加数据: create table stud(sno varchar(30) not null primary key,sname varchar(30) ...
- kotlin的suspend对比csharp的async&await
协程的出现大大降低了异步编程的复杂度,可以让我们像写同步代码一样去写异步代码,如果没有它,那么很多异步的代码都是需要靠回调函数来一层层嵌套,这个在我之前的一篇有介绍 rxjava回调地狱-kotlin ...
- day01-计算机的本质
计算机的本质 计算机又称为"电脑": 通电的大脑 意味着我们人类希望计算机通电之后可以跟人脑一样思考问题.解决问题 计算机存储数据的本质 计算机是基于电工作,而电信号只有高低电平两 ...