本文將介紹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 中介紹了兩種解...