如何讀懂SQL Server的事務日誌

2021-09-27 07:10:11 字數 3629 閱讀 8880

本文將介紹sql server的事務日誌中記錄了哪一些資訊,如何來讀懂這些事務日誌中資訊。首先介紹乙個微軟沒有公開的函式fn_dblog,在文章的接下來的部分主要用到這個函式來讀取事務日誌。

fn_dblog(@startinglsn,@endinglsn)

--@startinglsn:表示起始的lsn號,如果為null值則表示從首日誌記錄開始查詢。

--@endinglsn:表示結束的lsn號,如果為null值則表示查詢到尾日誌記錄。

--需要注意的是我們平時所看到的lsn都是十六進製制的,而這邊的引數需要轉化為十進位制,如00000021:00000077:0003在作為引數傳給fn_dblog時需要轉換為33:119:3

--建立測試資料庫

use [master];go

create

database testdb;go

-- 建立表

use testdb;go

create

table [location] (

[sr.no] int

identity,

[date] datetime

default getdate (),

[city] char (25) default 'xiamen');

通過上面的**建立了乙個名為testdb的資料庫,並建立了乙個三個欄位的表。接下看看事務日誌的內容

use testdb;go

select [current lsn],

[operation],

[transaction name],

[transaction id],

[transaction sid],

[spid],

[begin

time]

from

fn_dblog(null,null)

從上圖可以看出總共產生了195行日誌記錄,我擷取了部分的結果,在operation列中記錄了對應的lsn所做的操作,其中lop_begin_xact表示乙個事務的開始,transaction name顯示了建立的資料庫的名稱,而trasaction id則記錄了所對應的事務id。下面列出operation幾種比較常見而重要的值

接下來向表中插入100行資料,並檢視對應的事務日誌,**如下:

insert

into location default

values

go 100go

select

[current lsn],

[transaction id],

[operation],

[transaction name],

[context],

[allocunitname],

[page id],

[slot id],

[begin

time],

[end

time],

[number of locks],

[lock information]

from sys.fn_dblog(null,null)

where operation = 'lop_insert_rows' and allocunitname = 'dbo.location'

得到如上圖所示的結果,返回的行數與我們insert的次數一致,接下來取其中的乙個trasaction id來看看一次insert在事務日誌中記錄了哪些動作。

select

[current lsn], [transaction id], [operation], [transaction name], [context], [allocunitname], [page id], [slot id], [begin

time], [end

time], [number of locks], [lock information]

from sys.fn_dblog(null,null)

where [transaction id] = '0000:000002fc'

從圖中可以看出這個transaction執行步驟的詳細資訊

下面這一段是我從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的鎖資訊

begin

tran

insert

into location default

values

rollback

tran

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

可以看到lock information欄位所記錄的資訊與1200跟蹤標記鎖輸出的資訊是一致的。

另外從事務日誌中還可以看到sql server的一些內部操作,並看到這些操作一些具體資訊,如開始的時間,進行的次數,操作的步驟等等。接下來看看頁拆分的動作

--查詢頁拆分動作的transaction

select

[current lsn], [transaction id], [operation], [transaction name], [context], [allocunitname], [page id], [slot id], [begin

time], [end

time], [number of locks], [lock information]

from sys.fn_dblog(null,null)

where [transaction name] = 'splitpage'

--檢視具體transaction中的動作

select

[current lsn], [transaction id], [operation], [transaction name], [context], [allocunitname], [page id], [slot id], [begin

time], [end

time], [number of locks], [lock information]

from sys.fn_dblog(null,null)

where [transaction id] = '0000:000002f8'

通過了解事務日誌中所記錄的內容,可以更方便我們去了解sql server所做的一些操作的執行過程。

如何讀懂DataSheet

如何看datasheet 某些狀態所要維持的最短或最長時間。因為器件的工作速度也是有限的,一般都跟不上主控晶元的速度,所以它們直接之間要有時序配合。這有助於我們對晶元有乙個巨集觀的了解,此時需要弄清楚該晶元的一些比較特殊的功能,充分利用晶元的特殊功能,對整體電路的設計,將會有極大的好處。2.凡是晶元...

如何讀懂執行計畫

1 執行計畫概念 乙個執行計畫描述了一段sql語句建議的執行方法,該 計畫顯示oracle資料庫的執行sql時步驟的組合。每一步都得到資料庫中的物理資料行戒準備為他們的 使用者發布的宣告 2 生成執行計畫 使用語句生成 explain plan forselect from ods employe ...

如何讀懂複雜的C宣告

如何讀懂複雜的c宣告 k r曾經承認 c語言宣告的語法有時會帶來嚴重的問題 的確,諸如 char const next char c 10 int p 之類的宣告晦澀難懂,讓人迷茫。還好,peter van der linden在它的經典著作 expert c programming 中介紹了兩種解...