如何读懂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两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取到 ...
随机推荐
- tkinter之文件对话框
from tkinter import * from tkinter.filedialog import * filetype = [('Python Files', '*.py *.pyw'), ( ...
- Android 用ListView实现GridView分列显示
我想实现百度影音首页的这种效果: 在网上用ScrollView+GridView可以实现,但是touch scrollview的时候会莫名刷新gridview,这样用户体验很不好,而且感觉百度不是这样 ...
- mongodb安装服务
一.准备工作 1:下载: http://www.mongodb.org/downloads 2:解压到ZIP到 D:\Mongodb ,在此目录下再建立2个目录 D:\Mongodb\db和D ...
- Python3 如何优雅地使用正则表达式(详解五)
非捕获组命名组 精心设计的正则表达式可能会划分很多组,这些组不仅可以匹配相关的子串,还能够对正则表达式本身进行分组和结构化.在复杂的正则表达式中,由于有太多的组,因此通过组的序号来跟踪和使用会变得困难 ...
- IMAGE_SECTION_HEADER
typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAdd ...
- 如何给网页标题栏上添加图标(favicon.ico)
favicon.ico详解: favicon是Favorites Icon的缩写,favicon.ico是指显示在浏览器收藏夹.地址栏和标签标题前面的个性化图标. 设置步骤: 1. 把做好的f ...
- css属性之!important
提升指定样式规则的应用优先权. IE6及以下浏览器有个比较显式的支持问题存在,!important在同一条规则集里不生效.请看下述代码: div { color: #f00 !important; c ...
- COJ 0359 xjr考考你数据结构(根号2)线段树区间增加
xjr考考你数据结构(根号2) 难度级别:C: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你编写一个数据结构,完成以下功能: 1)求出第 ...
- 实现QQslidingMenu侧滑效果学习笔记
声明:只是自己的学习笔记,所以,只作为博友的参考,不喜勿喷 实现思路: 自定义继承HorizontalScrollView的控件 项目github地址: https://github.com/ysno ...
- 大型分布式C++框架《四:netio之请求包中转站 上》
本来一篇文章就该搞定的.结果要分上下篇了.主要是最近颈椎很不舒服.同时还在做秒杀的需求也挺忙的. 现在不能久坐.看代码的时间变少了.然后还买了两本治疗颈椎的书.在学着,不过感觉没啥用.突然心里好害怕. ...