简介

本文将介绍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. CREATE
    DATABASE TestDB;
  4. -- 创建表
  5. USE TestDB;
  6. CREATE
    TABLE [Location] (
  7.     [Sr.No] INT
    IDENTITY,
  8.     [Date] DATETIME
    DEFAULT GETDATE (),
  9.     [City] CHAR (25) DEFAULT 'xiamen');

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

  1. USE TestDB;
  2. select [Current LSN],
  3.        [Operation],
  4.        [Transaction Name],
  5.        [Transaction ID],
  6.        [Transaction SID],
  7.        [SPID],
  8.        [Begin
    Time]

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

行数据,并查看对应的事务日志,代码如下:

  1. GO 100
  2.  
  3.  [Current LSN],
  4.  [Transaction ID],
  5.  [Operation],
  6.   [Transaction Name],
  7.  [CONTEXT],
  8.  [AllocUnitName],
  9.  [Page ID],
  10.  [Slot ID],
  11.  [Begin
    Time],
  12.  [End
    Time],
  13.  [Number of Locks],
  14.  [Lock Information]
  15. WHERE Operation = 'LOP_INSERT_ROWS' AND AllocUnitName = 'dbo.Location'

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

  1.  [Current LSN], [Transaction ID], [Operation], [Transaction Name], [CONTEXT], [AllocUnitName], [Page ID], [Slot ID], [Begin
    Time], [End
    Time], [Number of Locks], [Lock Information]
  2. 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. DBCC TRACEOFF ( -1,1200)
  4. DBCC TRACEOFF ( -1,3604)
  5. /*
  6. Process 57 acquiring IX lock on OBJECT: 6:245575913:0 (class bit2000000 ref1) result: OK
  7. Process 57 acquiring IX lock on PAGE: 6:1:79 (class bit2000000 ref0) result: OK
  8. Process 57 acquiring X lock on RID: 6:1:79:90 (class bit2000000 ref0) result: OK
  9. */

跟踪标记锁输出的信息是一致的。

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

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

结语

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

如何读懂SQL Server的事务日志的更多相关文章

  1. 第十七周翻译-SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志

    SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志 作者:Tony Davis,2012/01/27 翻译:赖慧芳 译文: 该系列   本文是Stairway系列的一部分:SQL ...

  2. SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志(译)

    SQL Server中事务日志管理的步骤,第5级:完全恢复模式管理日志 作者:Tony Davis,2012/01/27 系列 本文是进阶系列的一部分:SQL Server中事务日志管理的步骤 当事情 ...

  3. SQL Server备份事务日志结尾(Tail)

    原文:http://blog.csdn.net/tjvictor/article/details/5256906   事务日志结尾经常提交数据库未备份的事务日志内容.基本上,每一次你执行事务日志备份时 ...

  4. SQL Server数据库事务日志序列号(LSN)介绍

    原文:http://blog.csdn.net/tjvictor/article/details/5251463     日志序列编号(LSN)是事务日志里面每条记录的编号. 当你执行一次备份时,一些 ...

  5. SQL Server数据库事务日志存储序列

    原文 原文:http://blog.csdn.net/tjvictor/article/details/5251351   如果你的数据库运行在完整或是批量日志恢复模式下,那么你就需要使用作业(job ...

  6. SQL SERVER的事务日志

    1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种: 完整模式,完全记录事物日志,需要定期进行 ...

  7. SQL Server 收缩事务日志的方法

    由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消:(SQL2005) Backup Log DataBaseName with no_ ...

  8. SQL Server提高事务复制效率优化(一)总体概述

      随着公司业务的发展,数据量增长迅速,在解决Scale Out的同时,还要考虑到主从的复制延迟问题,尽量降到1s以内满足线上业务,如果不调整,SQL Server默认的配置可能平均要3s左右.生产的 ...

  9. Step2:SQL Server 复制事务发布

    一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在Task数据库中有Basic与Group两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取到 ...

随机推荐

  1. 安装beautifulsoup的奇怪问题

    以前用的python2.7,改成3.4以后就重新下载了beatifulsoup4.解压到c:\Python34后.在cmd界面执行python setup.py install安装完成后.想看看安装成 ...

  2. 让一个Activity在开机后自动显示

    Activity本身不会在手机开机后自动运行的.但想让手机开机后就立刻做一些动作,需要使用广播接收器拦截手机开启广播,并在onReceive方法中完成相应的动作,如打开一个Activity. 广播接收 ...

  3. js插件zClip实现复制到剪贴板功能

    相信这个功能大家平时上网经常能碰到,以前也没怎么留意怎么实现的,直到项目中需要. 网上一搜一大堆,单纯使用js方法也不是没有,但是由于各浏览器的安全机制不同,不是跨浏览器的.去看了几个常用的网站,都是 ...

  4. NGINX关于配置PATHINFO

    最近在群里发现有很多小白不会配置pathinfo现贴出来配置代码照着配置就可以了     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2 ...

  5. CallableStatement执行存储过程

    /** * 使用CablleStatement调用存储过程 * @author APPle * */ public class Demo1 { /** * 调用带有输入参数的存储过程 * CALL p ...

  6. AngularJs 如何监视外部变量是否改变? 如何使用$cookieStore保存cookie?

    1. 如何监视外部变量是否改变? 如果我们要求:在$scope之外改变一个外部变量时,触发一些操作.我们可以将外部变量写进$watch中,如图中所示.返回的n表示newValue,即新的值.o表示ol ...

  7. [kuangbin带你飞]专题十 匹配问题 二分图最大权匹配

    二分图最大权匹配有km算法和网络流算法 km算法模板默认解决最大权匹配的问题 而使用最小费用最大流 是解决最小权匹配问题 这两种办法都可以求最大最小权 需要两次取反 TAT 感觉讲km会很难的样子.. ...

  8. android-support-v7-appcompat下载

    http://download.csdn.net/detail/u010556601/7449661 将压缩包解压,放入sdk\extras\android\support\v7目录下 在eclips ...

  9. 游览器保存密码和自动填充密码的困惑 (browser save password and auto fill password )

    原文 refer : http://www.cnblogs.com/happyfreelife/p/4240100.html 当一个带有username and password 的表单被提交, 游览 ...

  10. keep out layer PK board shape

    在进行设计pcb时,注意:板边线只能用PLACE LINE画线条,不能画具有电气性能的导线关于边界设置有三种,一.在 keepout layer 定义电气边界.二.design->board s ...