SQL Server中追蹤器Trace的介紹和簡單使用


一.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所無法提供的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM