如何读懂SQL Server的事务日志
简介
本文将介绍SQL Server的事务日志中记录了哪一些信息,如何来读懂这些事务日志中信息。首先介绍一个微软没有公开的函数fn_dblog,在文章的接下来的部分主要用到这个函数来读取事务日志。
- fn_dblog(@StartingLSN,@EndingLSN)
- --@StartingLSN:表示起始的LSN号,如果为NULL值则表示从首日志记录开始查询。
- --@EndingLSN:表示结束的LSN号,如果为NULL值则表示查询到尾日志记录。
- --需要注意的是我们平时所看到的LSN都是十六进制的,而这边的参数需要转化为十进制,如00000021:00000077:0003在作为参数传给fn_dblog时需要转换为33:119:3
正文
通过上面的代码创建了一个名为TestDB的数据库,并创建了一个三个字段的表。接下看看事务日志的内容
- USE TestDB;
- [Operation],
- [Transaction Name],
- [Transaction ID],
- [Transaction SID],
- [SPID],

从上图可以看出总共产生了195行日志记录,我截取了部分的结果,在Operation列中记录了对应的LSN所做的操作,其中LOP_BEGIN_XACT表示一个事务的开始,Transaction Name显示了创建的数据库的名称,而Trasaction ID则记录了所对应的事务ID。下面列出Operation几种比较常见而重要的值
- LOP_BEGIN_XACT 事务的开始
- LOP_LOCK_XACT 获取锁
- LOP_MODIFY_ROW 修改行(具体修改的对象可以查看AllocUnitName)
- LOP_COMMIT_XACT 提交事务
- LOP_DELETE_ROWS 删除数据
- LOP_INSERT_ROWS 插入数据
行数据,并查看对应的事务日志,代码如下:
- GO 100
- [Current LSN],
- [Transaction ID],
- [Operation],
- [Transaction Name],
- [CONTEXT],
- [AllocUnitName],
- [Page ID],
- [Slot ID],
- [Number of Locks],
- [Lock Information]

得到如上图所示的结果,返回的行数与我们insert的次数一致,接下来取其中的一个Trasaction ID来看看一次insert在事务日志中记录了哪些动作。
- [Current LSN], [Transaction ID], [Operation], [Transaction Name], [CONTEXT], [AllocUnitName], [Page ID], [Slot ID], [Begin
Time], [End
Time], [Number of Locks], [Lock Information] - WHERE [Transaction ID] = '0000:000002fc'

从图中可以看出这个Transaction执行步骤的详细信息
- 在2014/05/25 18:35:39:197事务开始
- 在堆表dbo.Location的PAGEID为0001:0000004f插入数据
- 在2014/05/24 18:35:39:200提交事务
下面这一段是我从Lock Information栏位复制出的内容,来详细的看一下
- HoBt 72057594039042048:ACQUIRE_LOCK_IX OBJECT: 6:245575913:0 ;ACQUIRE_LOCK_IX PAGE: 6:1:79 ;ACQUIRE_LOCK_X RID: 6:1:79:0
通过下面的代码我们来验证一下,这样一条INSERT语句所获得的锁信息
- DBCC TRACEON(-1,3604)
- DBCC TRACEON (-1,1200)--查看当前Session的锁信息
- DBCC TRACEOFF ( -1,1200)
- DBCC TRACEOFF ( -1,3604)
- /*
- Process 57 acquiring IX lock on OBJECT: 6:245575913:0 (class bit2000000 ref1) result: OK
- Process 57 acquiring IX lock on PAGE: 6:1:79 (class bit2000000 ref0) result: OK
- Process 57 acquiring X lock on RID: 6:1:79:90 (class bit2000000 ref0) result: OK
- */
跟踪标记锁输出的信息是一致的。
另外从事务日志中还可以看到SQL Server的一些内部操作,并看到这些操作一些具体信息,如开始的时间,进行的次数,操作的步骤等等。接下来看看页拆分的动作
- --查找页拆分动作的Transaction
- [Current LSN], [Transaction ID], [Operation], [Transaction Name], [CONTEXT], [AllocUnitName], [Page ID], [Slot ID], [Begin
Time], [End
Time], [Number of Locks], [Lock Information] - WHERE [Transaction Name] = 'SplitPage'
- --查看具体Transaction中的动作
- [Current LSN], [Transaction ID], [Operation], [Transaction Name], [CONTEXT], [AllocUnitName], [Page ID], [Slot ID], [Begin
Time], [End
Time], [Number of Locks], [Lock Information] - WHERE [Transaction ID] = '0000:000002f8'

结语
通过了解事务日志中所记录的内容,可以更方便我们去了解SQL Server所做的一些操作的执行过程。
如何读懂SQL Server的事务日志的更多相关文章
- 第十七周翻译-SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志
SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志 作者:Tony Davis,2012/01/27 翻译:赖慧芳 译文: 该系列 本文是Stairway系列的一部分:SQL ...
- SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志(译)
SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志 作者:Tony Davis,2012/01/27 系列 本文是进阶系列的一部分:SQL Server中事务日志管理的步骤 当事情 ...
- SQL Server备份事务日志结尾(Tail)
原文:http://blog.csdn.net/tjvictor/article/details/5256906 事务日志结尾经常提交数据库未备份的事务日志内容.基本上,每一次你执行事务日志备份时 ...
- SQL Server数据库事务日志序列号(LSN)介绍
原文:http://blog.csdn.net/tjvictor/article/details/5251463 日志序列编号(LSN)是事务日志里面每条记录的编号. 当你执行一次备份时,一些 ...
- SQL Server数据库事务日志存储序列
原文 原文:http://blog.csdn.net/tjvictor/article/details/5251351 如果你的数据库运行在完整或是批量日志恢复模式下,那么你就需要使用作业(job ...
- SQL SERVER的事务日志
1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种: 完整模式,完全记录事物日志,需要定期进行 ...
- SQL Server 收缩事务日志的方法
由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消:(SQL2005) Backup Log DataBaseName with no_ ...
- SQL Server提高事务复制效率优化(一)总体概述
随着公司业务的发展,数据量增长迅速,在解决Scale Out的同时,还要考虑到主从的复制延迟问题,尽量降到1s以内满足线上业务,如果不调整,SQL Server默认的配置可能平均要3s左右.生产的 ...
- Step2:SQL Server 复制事务发布
一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在Task数据库中有Basic与Group两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取到 ...
随机推荐
- GitHub——如何更新已经fork的代码
github上有个很方便的功能叫fork,将别人的工程一键复制到自己账号下.这个功能很方便,但有点不足的是,当源项目更新后,你fork的分支并不会一起更新,需要自己手动去更新.下面记录下网上找到的更新 ...
- 关于C++的变量和类的声明和定义
什么是变量?变量或者叫对象,是一个有具名的.可以供程序操作的存储空间.这里具名是指变量是有名字的,可供操作是指能进行加减乘除或者输入输出等操作,存储空间则是指有一块属于它的内存空间. 为了便于说明,标 ...
- jquery中的replaceWith()和html()有什么区别?
区别在于,html()会替换指定元素内部的HTML,而replaceWith()会替换元素本身及其内部的HTML. 例子: 1 <div id="myid" /> 1 ...
- 解决.VS2012+EF5.0开发的网站在window server2003上无法部署的问题(转载)
转载:http://www.cnblogs.com/eggTwo/p/3653825.html (一)前 言 ...
- JavaScript中的类式继承和原型式继承
最近在看<JavaScript设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...
- IIS下图片防盗连设置详解
小站只有100个IIS,盗链后经常是连主页都打不开,就想着弄个图片防盗链,在网上找了一下资料,正则表达式的写法啊,ISAPI_REWRITE基本配置啊等等,找来啃了一天终于发现有三个方法实现. 第一. ...
- flask开发restful api系列(7)-蓝图与项目结构
如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而 ...
- 在centos服务器上配置gitlab钩子引发的一系列问题
为了给公司的服务器上搭建gitlab环境并且配置钩子(实现在本地git push之后服务器自动git pull),整了好久,最后终于把问题解决了,下面是记录安装gitlab之后引发的一系列问题: 首先 ...
- javaWeb实现使用邮箱邮件找回密码功能
JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...
- HP Webinspect 10 访问wap的url
HP Webinspect是著名的扫描工具,这里讲一下怎么使用它扫wap的url. 通俗的讲,Wap是手机网页浏览器使用的网页,web是电脑网页浏览器使用的网页.(讲得不专业,但方便理解) 在手机上显 ...