您的位置:首页 > 博客中心 > 数据库 >

如何读懂SQL Server的事务日志

时间:2022-03-10 17:20

简介

本文将介绍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. CREATEDATABASE TestDB;
  5. GO
  6. -- 创建表
  7. USE TestDB;
  8. GO
  9. CREATETABLE [Location] (
  10.     [Sr.No] INTIDENTITY,
  11.     [Date] DATETIMEDEFAULT 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.        [BeginTime]
  10. FROMfn_dblog(null,null)

gxlsystem.com,布布扣

从上图可以看出总共产生了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. INSERTINTO Location DEFAULTVALUES
  2. GO 100
  3. GO
  4.  
  5. SELECT
  6.  [Current LSN],
  7.  [Transaction ID],
  8.  [Operation],
  9.   [Transaction Name],
  10.  [CONTEXT],
  11.  [AllocUnitName],
  12.  [Page ID],
  13.  [Slot ID],
  14.  [BeginTime],
  15.  [EndTime],
  16.  [Number of Locks],
  17.  [Lock Information]
  18. FROM sys.fn_dblog(NULL,NULL)
  19. WHERE Operation = ‘LOP_INSERT_ROWS‘ AND AllocUnitName = ‘dbo.Location‘

gxlsystem.com,布布扣

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

  1. SELECT
  2.  [Current LSN], [Transaction ID], [Operation], [Transaction Name], [CONTEXT], [AllocUnitName], [Page ID], [Slot ID], [BeginTime], [EndTime], [Number of Locks], [Lock Information]
  3. FROM sys.fn_dblog(NULL,NULL)
  4. WHERE [Transaction ID] = ‘0000:000002fc‘

gxlsystem.com,布布扣

从图中可以看出这个Transaction执行步骤的详细信息

    结语

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

    如何读懂SQL Server的事务日志,布布扣,bubuko.com

热门排行

今日推荐

热门手游