一.What is Trace?
對於SQL Profiler這個工具相信大家都不是很陌生,沒用過的朋友可以在SQL Server Management Studio>工具>SQL Server Profiler處使用。這個工具是用來監控SQL,存儲過程的執行,用戶登錄等等信息。但這個工具只是一個GUI,他的本質就是Trace。下面是Trace的架構:
數據庫引擎會產生一系列事件,然后各個trace可以去訂閱自己感興趣的事件,一旦數據庫產生了相關事件就會發給訂閱該事件的trace,各個trace通過自己的過濾器對該事件的信息過濾(例如:捕獲執行時間超過1秒的SQL語句),然后放到一個緩沖隊列里,最終寫入文件或者是一些客戶端應用。
簡單介紹完理論,下面就開始實踐:
How to Create a Trace?
要創建一個追蹤器,總共分三步:
1.執行存儲過程sp_trace_create創建一個追蹤器
2.執行存儲過程sp_trace_setevent添加自己想訂閱的事件以及最終結果集的列名
3.執行存儲過程sp_trace_setfilter設置過濾器來對過濾產生數據
下面是一個創建一個追蹤器的SQL腳本
1 DECLARE @return_code INT; 2 DECLARE @TraceID INT; 3 DECLARE @maxfilesize BIGINT; 4 SET @maxfilesize = 5; 5 --step 1: create a new empty trace definition 6 EXEC sp_trace_create 7 @traceid OUTPUT 8 , @options = 2 9 , @tracefile = N'C:\TraceFiles\LongRunningQueries' 10 , @maxfilesize = @maxfilesize 11 , @stoptime =NULL 12 , @filecount = 2; 13 -- step 2: add the events and columns 14 EXEC sp_trace_setevent 15 @traceid = @TraceID 16 , @eventid = 10 -- RPC:Completed 17 , @columnid = 1 -- TextData 18 , @on = 1;--include this column in trace 19 EXEC sp_trace_setevent 20 @traceid = @TraceID 21 , @eventid = 10 -- RPC:Completed 22 , @columnid = 13 --Duration 23 , @on = 1;--include this column in trace 24 EXEC sp_trace_setevent 25 @traceid = @TraceID 26 , @eventid = 10 -- RPC:Completed 27 , @columnid = 15 --EndTime 28 , @on = 1;--include this column in trace 29 EXEC sp_trace_setevent 30 @traceid = @TraceID 31 , @eventid = 12 -- SQL:BatchCompleted 32 , @columnid = 1 -- TextData 33 , @on = 1;--include this column in trace 34 EXEC sp_trace_setevent 35 @traceid = @TraceID 36 , @eventid = 12 -- SQL:BatchCompleted 37 , @columnid = 13 --Duration 38 , @on = 1;--include this column in trace 39 EXEC sp_trace_setevent 40 @traceid = @TraceID 41 , @eventid = 12 -- SQL:BatchCompleted 42 , @columnid = 15 --EndTime 43 , @on = 1;--include this column in trace 44 -- step 3: add duration filter 45 DECLARE @DurationFilter BIGINT; 46 SET @DurationFilter = 10000000; --duration in microseconds 47 EXEC sp_trace_setfilter 48 @traceid = @TraceID 49 , @columnid = 13 50 , @logical_operator = 0 --AND 51 , @comparison_operator = 4 -- greater than or equal to 52 , @value = @DurationFilter; --filter value 53 SELECT @TraceID AS TraceID;
對於第九行中的C:\TraceFiles\LongRunningQueries,請確保TraceFiles文件夾存在,而LongRunningQueries是文件名,創建后會自動加上.trc后綴。
對於過濾器中具體的事件以及列名,大家可以參考:http://technet.microsoft.com/zh-cn/library/ms186265(v=sql.105).aspx
對於像我一樣的一些初學者,寫上面的腳本可能比較吃力,那么我們可以通過SQL Server Profiler配置各種需求,然后導出腳本:
然后把路徑等一系列其他參數設置下即可。
三.How to Operate a Trace?
上面我們已經把創建了一個追蹤器,但這個追蹤器目前並未開始運行,我們可以通過下面的腳本來查看trace的狀態
select * from sys.traces
執行之后你會發現有2個trace記錄,第一個是SQL Server默認的trace,它提供極其有限的功能,第二個就是我們剛剛創建的trace
status就是指追蹤器的狀態
@status | Action |
0 | Stops the trace |
1 | Starts the trace |
2 | Closes the trace and deletes its definition |
操作status的腳本:
-- stop the trace DECLARE @TraceID int ; SET @TraceID = 2 ; -- specify value from sp_trace_create EXEC sp_trace_setstatus @traceid = @TraceID ,@status = 0 ;-- stop trace -- delete the trace EXEC sp_trace_setstatus @traceid = @TraceID ,@status = 2 ;-- delete trace -- start the trace EXEC sp_trace_setstatus @traceid = @TraceID ,@status = 1 ;-- start trace
四.How to Viewing Trace Data?
前面已經說過,追蹤器最終把追蹤到的信息寫到了一個文件里,也就是我們創建時指定的路徑。通過一個系統函數就可以查看分析這些數據了:
SELECT * FROM fn_trace_gettable(N'C:\TraceFiles\LongRunningQueries.trc',DEFAULT);
五.Summary
SQL Trace對象提供服務器端的追蹤的技術,包括一些存儲過程,數據庫,視圖來創建trace, 通過使用T-SQL和trace暴露的元數據來管理trace數據,這些都是SQL Profiler所無法提供的