若何捕捉和記載SQL Server中產生的逝世鎖。本站提示廣大學習愛好者:(若何捕捉和記載SQL Server中產生的逝世鎖)文章只能為提供參考,不一定能成為您想要的結果。以下是若何捕捉和記載SQL Server中產生的逝世鎖正文
辦法一:應用SQL Server署理(Alert+Job)
詳細步調以下:
1.起首應用上面的敕令,將有關的跟蹤標記啟用。
SQL code
DBCC TRACEON (3605,1204,1222,-1)
解釋:
3605 將DBCC的成果輸入到毛病日記。
1204 前往介入逝世鎖的鎖的資本和類型,和受影響確當前敕令。
1222 前往介入逝世鎖的鎖的資本和類型,和應用了不相符任何 XSD 架構的 XML 格局的受影響確當前敕令(比1204更進一步,SQL 2005及以上可用)。
-1 以全局方法翻開指定的跟蹤標志。
以上跟蹤標記感化域都是全局,即在SQL Server運轉進程中,會一向施展感化,直到SQL Server重啟。
假如要確保SQL Server在重啟後主動開啟這些標記,可以在SQL Server辦事啟動選項中,應用 /T 啟動選項指定跟蹤標記在啟動時代設置為開。(位於SQL Server設置裝備擺設治理器->SQL Server辦事->SQL Server->屬性->高等->啟動參數)
在運轉下面的語句後,當SQL Server中產生逝世鎖時,曾經可以在毛病日記中看到了,但還不敷直不雅(和其它信息混在一路)。(SSMS -> SQL Server實例 -> 治理 -> SQL Server日記)
2.建表,寄存逝世鎖記載
SQL code
USE [Cole] --Cole是我的示例數據庫,你可以依據現實情形修正。
GO
CREATE TABLE DeadLockLog (
id int IDENTITY (1, 1) NOT NULL,
LogDate DATETIME,
ProcessInfo VARCHAR(10),
ErrorText VARCHAR(MAX)
)
GO
3.樹立JOB
新建一個JOB(假定稱號為DeadLockJob),在"步調"中新建一步調,隨意寫一個步調稱號,數據庫為"Cole"(見2.建表),在"敕令"欄中輸出以下語句:
SQL code
--新建暫時表
IF OBJECT_ID('tempdb.dbo.#ErrorLog') IS Not Null
DROP TABLE #ErrorLog
CREATE TABLE #ErrorLog (Id int IDENTITY (1, 1) NOT NULL, a DATETIME, b VARCHAR(10), c VARCHAR(MAX))
--將以後日記記載拔出暫時表
INSERT INTO #ErrorLog EXEC master.dbo.sp_readerrorlog
--將逝世鎖信息拔出用戶表
insert DeadLockLog
select a, b, c
from #ErrorLog
where id >= (select MAX(id) from #ErrorLog WHERE c Like '%Deadlock encountered%')
DROP TABLE #ErrorLog
4.新建警報
在"新建警報"窗體的"慣例"選項卡中,停止以下設置:
稱號:可依據現實自行定名,這裡我用DeadLockAlert
類型:選擇"SQL Server機能前提警報"
對象:SQLServer:Locks
計數器:Number of Deadlocks/sec
實例:_Total
計數器知足以下前提時觸發警報:高於
值:0
設置完成後,應當以下圖所示:
在"呼應"選項卡中,選中"履行功課",並選擇步調3中我們新建的功課(即DeadlockJob)
到這裡為止,我們曾經完成了全體步調,今後,你便可以隨時查詢DeadLockLog表,來顯示逝世鎖信息了。
辦法二:應用辦事器端跟蹤。
詳細完成步調以下:
1.編寫以下劇本,並履行
SQL code
-- 界說參數
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 5
-- 初始化跟蹤
exec @rc = sp_trace_create @TraceID output, 0, N'e:/DbLog/deadlockdetect', @maxfilesize, NULL
--此處的e:/dblog/deadlockdetect是文件名(可自行修正),SQL會主動在前面加上.trc的擴大名
if (@rc != 0) goto error
-- 設置跟蹤事宜
declare @on bit
set @on = 1
--下述語句中的148指的是locks:deadlock graph事宜(拜見sys.trace_events),12指的是spid列(拜見sys.trace_columns)
exec sp_trace_setevent @TraceID, 148, 12, @on
exec sp_trace_setevent @TraceID, 148, 11, @on
exec sp_trace_setevent @TraceID, 148, 4, @on
exec sp_trace_setevent @TraceID, 148, 14, @on
exec sp_trace_setevent @TraceID, 148, 26, @on
exec sp_trace_setevent @TraceID, 148, 64, @on
exec sp_trace_setevent @TraceID, 148, 1, @on
-- 啟動跟蹤
exec sp_trace_setstatus @TraceID, 1
-- 記載下跟蹤ID,以備前面應用
select TraceID = @TraceID
goto finish
error:
select ErrorCode=@rc
finish:
go
運轉上述語句後,每當SQL Server中產生逝世鎖事宜,都邑主動往文件e:/DbLog/deadlockdetect.trc中拔出一筆記錄。
2.暫停和停滯辦事器端跟蹤
假如要暫停下面的辦事器端跟蹤,可運轉上面的語句:
SQL code
exec sp_trace_setstatus 1, 0 --第一個參數表現TraceID,即步調1中的輸入參數。第二個參數表現將狀況改成0,即暫停
假如要停滯下面的辦事器端跟蹤,可運轉上面的語句:
SQL code
exec sp_trace_setstatus 1, 2 --第一個參數表現TraceID,即步調1中的輸入參數。第二個參數表現將狀況改成2,即停滯
3.檢查跟蹤文件內容
關於下面生成的跟蹤文件(e:/DbLog/deadlockdetect.trc),可經由過程兩種辦法檢查:
1).履行t-sql敕令
SQL code
select * from fn_trace_gettable('e:/DbLog/deadlockdetect.trc',1)
成果中的TextData列即以XML的情勢前往逝世鎖的具體信息。
2).在SQL Server Profiler中翻開。
順次 進入Profiler -> 翻開跟蹤文件 ->選擇e:/DbLog/deadlockdetect.trc,便可以看到以圖形情勢展示的逝世鎖信息了。