程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 若何捕捉和記載SQL Server中產生的逝世鎖

若何捕捉和記載SQL Server中產生的逝世鎖

編輯:MySQL綜合教程

若何捕捉和記載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,便可以看到以圖形情勢展示的逝世鎖信息了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved