SQL Server Profiler(事件探查器)雖功能強大,但不支援排程自動啟動。若需定時追蹤特定時段的伺服器運行狀態,透過 T-SQL 腳本搭配 SQL Server Agent Job 即可實現自動化追蹤。本文詳細說明腳本建立追蹤的核心預存程序、最簡生成流程及常見問題應對。
以下腳本由 Profiler 導出並簡化,展示建立追蹤的完整流程:
DECLARE @rc INT, @TraceID INT, @maxfilesize BIGINT;
SET @maxfilesize = 5; -- 最大檔案大小 (MB)
-- 建立追蹤佇列,指定輸出檔案路徑 (需伺服器有寫入權限)
EXEC @rc = sp_trace_create @TraceID OUTPUT, 0, N'C:\Trace\MyTrace', @maxfilesize, NULL;
IF (@rc != 0) GOTO error;
-- 設定追蹤事件 (範例: SQL:BatchCompleted 事件 ID 12, 欄位 TextData=1, SPID=12, StartTime=14)
DECLARE @on BIT = 1;
EXEC sp_trace_setevent @TraceID, 12, 1, @on;
EXEC sp_trace_setevent @TraceID, 12, 12, @on;
EXEC sp_trace_setevent @TraceID, 12, 14, @on;
-- 設定過濾器 (範例: 排除 ApplicationName='SQL Profiler', CPU>100, DatabaseID=1, DatabaseName='pubs')
DECLARE @intfilter INT, @bigintfilter BIGINT;
EXEC sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Profiler';
SET @intfilter = 100; EXEC sp_trace_setfilter @TraceID, 22, 0, 4, @intfilter;
SET @intfilter = 1; EXEC sp_trace_setfilter @TraceID, 23, 1, 0, @intfilter;
EXEC sp_trace_setfilter @TraceID, 35, 1, 6, N'pubs';
-- 啟動追蹤
EXEC sp_trace_setstatus @TraceID, 1;
SELECT TraceID = @TraceID; -- 記錄 TraceID 供後續停止/查詢使用
GOTO finish;
error: SELECT ErrorCode = @rc;
finish: GO
sp_trace_create 中的檔案路徑參數,即可在需要時直接執行該腳本啟動追蹤。啟動後可關閉查詢視窗,追蹤於背景持續運行。追蹤記錄非即時寫入檔案,停止追蹤時才可能將緩衝資料刷入檔案。
SELECT * FROM ::fn_trace_getinfo(0);
-- 停止 (保留定義,可重新啟動) EXEC sp_trace_setstatus @traceid = 1, @status = 0; -- 關閉並釋放資源 EXEC sp_trace_setstatus @traceid = 1, @status = 2;
建議在 Job 步驟中先啟動追蹤,再排程另一 Job 於指定時間執行停止/關閉指令,構建完整自動化追蹤方案。