DBCC TRACEON (3605, 1204, 1222, -1);
/T3605 /T1204 /T1222 持久化USE [YourDB];
CREATE TABLE DeadLockLog (
id INT IDENTITY(1,1) PRIMARY KEY,
LogDate DATETIME,
ProcessInfo VARCHAR(10),
ErrorText VARCHAR(MAX)
);
-- 作業步驟命令
IF OBJECT_ID('tempdb..#ErrorLog') IS NOT NULL DROP TABLE #ErrorLog;
CREATE TABLE #ErrorLog (Id INT IDENTITY(1,1), a DATETIME, b VARCHAR(10), c VARCHAR(MAX));
INSERT INTO #ErrorLog EXEC master.dbo.sp_readerrorlog;
INSERT INTO DeadLockLog (LogDate, ProcessInfo, ErrorText)
SELECT a, b, c FROM #ErrorLog
WHERE Id >= (SELECT MAX(Id) FROM #ErrorLog WHERE c LIKE '%Deadlock encountered%');
DROP TABLE #ErrorLog;
DECLARE @rc INT, @TraceID INT, @maxfilesize BIGINT = 5;
EXEC @rc = sp_trace_create @TraceID OUTPUT, 0, N'E:/DbLog/deadlockdetect', @maxfilesize, NULL;
IF (@rc != 0) GOTO error;
DECLARE @on BIT = 1;
-- 148 = Locks:Deadlock Graph, 相關欄位請參考 sys.trace_events/columns
EXEC sp_trace_setevent @TraceID, 148, 12, @on; -- SPID
EXEC sp_trace_setevent @TraceID, 148, 11, @on; -- LoginName
EXEC sp_trace_setevent @TraceID, 148, 4, @on; -- DatabaseID
EXEC sp_trace_setevent @TraceID, 148, 14, @on; -- StartTime
EXEC sp_trace_setevent @TraceID, 148, 26, @on; -- ServerName
EXEC sp_trace_setevent @TraceID, 148, 64, @on; -- SessionLoginName
EXEC sp_trace_setevent @TraceID, 148, 1, @on; -- TextData (XML 死鎖圖)
EXEC sp_trace_setstatus @TraceID, 1; -- 啟動
SELECT TraceID = @TraceID; -- 記下 ID 供後續控制
GOTO finish;
error: SELECT ErrorCode = @rc;
finish: GO
-- 暫停
EXEC sp_trace_setstatus @TraceID, 0;
-- 停止並關閉
EXEC sp_trace_setstatus @TraceID, 2;
SELECT * FROM fn_trace_gettable('E:/DbLog/deadlockdetect.trc', 1);,TextData 欄位為 XML 死鎖圖| 維度 | 方案一 (Agent+旗標) | 方案二 (伺服器端追蹤) |
|---|---|---|
| 部署複雜度 | 低 | 中 |
| 效能影響 | 較高 (寫錯誤日誌) | 低 (非同步寫檔) |
| 資訊豐富度 | 文字為主 | 完整 XML 圖形 |
| 持久化 | 需設定啟動參數 | 需手動啟動/腳本自動化 |
建議:生產環境優先採用方案二,搭配定時作業清理舊追蹤檔;方案一適合快速臨時排查。