本文将介绍SQL Server的事务日志中记录了哪一些信息,如何来读懂这些事务日志中信息。首先介绍一个微软没有公开的函数fn_dblog,在文章的接下来的部分主要用到这个函数来读取事务日志。

  1. fn_dblog(@StartingLSN,@EndingLSN)
  2. --@StartingLSN:表示起始的LSN号,如果为NULL值则表示从首日志记录开始查询。
  3. --@EndingLSN:表示结束的LSN号,如果为NULL值则表示查询到尾日志记录。
  4. --需要注意的是我们平时所看到的LSN都是十六进制的,而这边的参数需要转化为十进制,如00000021:00000077:0003在作为参数传给fn_dblog时需要转换为33:119:3

正文

  1. --创建测试数据库
  2. USE [master];
  3. GO
  4. CREATE DATABASE TestDB;
  5. GO
  6. -- 创建表
  7. USE TestDB;
  8. GO
  9. CREATE TABLE [Location] (
  10.     [Sr.No] INT IDENTITY,
  11.     [Date] DATETIME DEFAULT GETDATE (),
  12.     [City] CHAR (25) DEFAULT 'xiamen');

通过上面的代码创建了一个名为TestDB的数据库,并创建了一个三个字段的表。接下看看事务日志的内容

  1. USE TestDB;
  2. GO
  3. select [Current LSN],
  4.        [Operation],
  5.        [Transaction Name],
  6.        [Transaction ID],
  7.        [Transaction SID],
  8.        [SPID],
  9.        [Begin Time]
  10. FROM fn_dblog(null,null)

从上图可以看出总共产生了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 插入数据

接下来向表中插入100行数据,并查看对应的事务日志,代码如下:

  1. INSERT INTO Location DEFAULT VALUES
  2. GO 100
  3. GO
  4. SELECT
  5.  [Current LSN],
  6.  [Transaction ID],
  7.  [Operation],
  8.   [Transaction Name],
  9.  [CONTEXT],
  10.  [AllocUnitName],
  11.  [Page ID],
  12.  [Slot ID],
  13.  [Begin Time],
  14.  [End Time],
  15.  [Number of Locks],
  16.  [Lock Information]
  17. FROM sys.fn_dblog(NULL,NULL)
  18. WHERE Operation = 'LOP_INSERT_ROWS' AND AllocUnitName = 'dbo.Location'

得到如上图所示的结果,返回的行数与我们insert的次数一致,接下来取其中的一个Trasaction ID来看看一次insert在事务日志中记录了哪些动作。

  1. SELECT
  2.  [Current LSN], [Transaction ID], [Operation], [Transaction Name], [CONTEXT], [AllocUnitName], [Page ID], [Slot ID], [Begin Time], [End Time], [Number of Locks], [Lock Information]
  3. FROM sys.fn_dblog(NULL,NULL)
  4. 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栏位复制出的内容,来详细的看一下

  1. 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语句所获得的锁信息

  1. DBCC TRACEON(-1,3604)
  2. DBCC TRACEON (-1,1200)--查看当前Session的锁信息
  3. BEGIN TRAN
  4. INSERT INTO Location DEFAULT VALUES
  5. ROLLBACK TRAN
  6. DBCC TRACEOFF ( -1,1200)
  7. DBCC TRACEOFF ( -1,3604)
  8. /*
  9. Process 57 acquiring IX lock on OBJECT: 6:245575913:0 (class bit2000000 ref1) result: OK
  10. Process 57 acquiring IX lock on PAGE: 6:1:79 (class bit2000000 ref0) result: OK
  11. Process 57 acquiring X lock on RID: 6:1:79:90 (class bit2000000 ref0) result: OK
  12. */

可以看到Lock Information栏位所记录的信息与1200跟踪标记锁输出的信息是一致的。

另外从事务日志中还可以看到SQL Server的一些内部操作,并看到这些操作一些具体信息,如开始的时间,进行的次数,操作的步骤等等。接下来看看页拆分的动作

  1. --查找页拆分动作的Transaction
  2. SELECT
  3.  [Current LSN], [Transaction ID], [Operation], [Transaction Name], [CONTEXT], [AllocUnitName], [Page ID], [Slot ID], [Begin Time], [End Time], [Number of Locks], [Lock Information]
  4. FROM sys.fn_dblog(NULL,NULL)
  5. WHERE [Transaction Name] = 'SplitPage'
  6. --查看具体Transaction中的动作
  7. SELECT
  8.  [Current LSN], [Transaction ID], [Operation], [Transaction Name], [CONTEXT], [AllocUnitName], [Page ID], [Slot ID], [Begin Time], [End Time], [Number of Locks], [Lock Information]
  9. FROM sys.fn_dblog(NULL,NULL)
  10. WHERE [Transaction ID] = '0000:000002f8'

结语

通过了解事务日志中所记录的内容,可以更方便我们去了解SQL Server所做的一些操作的执行过程

如何读懂SQL Server的事务日志相关推荐

  1. SQL Server 为什么事务日志自动增长会降低你的性能

    原文地址:点击打开链接 在这篇文章里,我想详细谈下为什么你要避免事务日志(Transaction Log)上的自动增长操作(Auto Growth operations).很多运行的数据库服务器,对于 ...

  2. SQL Server中事务日志自动增长对性能的影响

    SQL Server中事务日志自动增长对性能的影响 SQL Server中事务日志自动增长对性能的影响(上) SQL Server中事务日志自动增长对性能的影响(下) posted on 2011-0 ...

  3. XenDesktop 5 SQL Server Mirror事务日志比较大的原因分析

    在实施XenDesktop5项目过程中,发现XenDesktop5版本的数据库镜像事务日志很大,在XenDesktop4和XenApp版本中不存在该问题:于是我根据该现象探究XenDesktop5及以 ...

  4. [ZT]SQL Server 的事务日志意外增大或充满的处理方法

    http://support.microsoft.com/kb/317375 事务日志文件Transaction Log File是用来记录数据库更新情况的文件,扩展名为ldf. 在 SQL Serv ...

  5. 如何利用SQL Server的事务日志?

    介绍 (Introduction) SQL Server keeps track of all database modifications and every database transactio ...

  6. SQL Server中事务日志已满的原因以及解决办法

    错误描述:数据库的事务日志已满.若要查明无法重用日志中的空间的原因 ,请参阅sys.databases 中的 log_reuse_wait_desc 列 . 首先引入一下事务日志的概念(来自百度百科) ...

  7. sql server数据库事务日志已满请参阅log_reuse_wait_desc怎么解决?

    数据库使用时,莫名其妙出现关于事务日志已满的报错.具体报错如下: 数据库中的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅sys.databases中的log_reuse_wait_desc ...

  8. 快速搞懂 SQL Server 的锁定和阻塞

    本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量. 所谓的「阻塞」,是指当 ...

  9. SQL Server提高事务复制效率优化(二)快照初始化优化

    SQL Server提高事务复制效率优化(二)快照初始化优化 测试数据表量1500w+,使用初始化默认的快照代理参数,复制的三个过程包括快照初始化,订阅初始化和数据修改复制,主要对快照代理.分发代理. ...

最新文章

  1. Swift3.0语言教程使用字符串创建和初始化字符串
  2. 计算机网络期中考察方案,计算机网络期中考试题 b卷_ans.docx
  3. 专题:固体力学中应力与应变分析详解(6.莫尔应力圆)
  4. LeetCode Algorithm 274. H 指数
  5. 计算机右键管理显示没权限,解决右键 选择打开方式提示没有权限
  6. [JavaWeb-HTML]HTML标签_列表标签
  7. python多线程_python多线程:控制线程数量
  8. MobaXterm 错行,乱码
  9. java喷泉编码_好程序员Java教程分享使用JS实现简单喷泉效果
  10. MySQL事件的使用
  11. React+Redux系列教程
  12. iOS Accessibility指南
  13. 结网读书笔记-从产品经理的角度看产品
  14. 亚信科技java笔试题答案_亚信科技java面试题及答案.doc
  15. Scratch编程(八)扩展模块:文字朗读模块
  16. java poi word 复制_java poi实现word导出(包括word模板的使用、复制表格、复制行、插入图片的使用)...
  17. 新浪云存储 php,新浪云存储SCS | SDK
  18. 计算机英语口语900句,日常英语口语900句
  19. 超闩锁和子闩锁如何工作的
  20. 一维数组(简单摇骰子小游戏)

热门文章

  1. [个人笔记]关于AccountManager
  2. redhat 8 linux忘记root密码重置
  3. 华为发布《智能世界2030》报告,多维探索未来十年趋势
  4. XiaoHu日志 9/5~9/6
  5. python里感叹号是什么意思_感叹号!代表什么意思?(标点符号的用法之感叹号)...
  6. App通过QQ/微信登录绑定用户信息的一般流程
  7. 微信小程序中开发的小坑
  8. 路径正确下,Eclipse读取txt文件仍失败
  9. Android动态广播添加权限
  10. 路由器WAN网口可接入192.168.0.1管理无线密码