使用Trace Management Object監測和診斷SQL Server(二)

iSQlServer發表於2009-05-27

在這篇文章中我們將介紹一個replay trace的示例,通過重放抓到的trace檔案來診斷應用程式在SQL Server上執行是否有問題。

Replay trace示例

這個例子模仿你使用Profiler工具對抓到的trace檔案進行重放,從而對SQL Server及你的應用程式進行診斷的過程。下面是詳細的步驟和描述。

1、TraceReplay類是對trace file或trace table進行重放的關鍵類,你需要設定TraceReplay的三個屬性,Connection屬性代表你將在哪個資料庫例項上進行重放,Source屬性代表重放哪個檔案或資料表,OutputFile代表重放的結果將輸出到哪個檔案,你也可以使用OutputTable屬性指定將重放結果輸出到資料表中。下面的程式碼將使用capture trace例子裡抓到的trace file作為重放的輸入並將結果存為traceoutput.trc檔案。

TraceReplay replay = new TraceReplay();
SqlConnectionInfo connInfo = new SqlConnectionInfo(".");
connInfo.UseIntegratedSecurity = true;
replay.Connection = connInfo;
TraceFile traceFile = new TraceFile();
traceFile.InitializeAsReader(@"c:\tracefile.trc");
replay.Source = traceFile;
TraceFile traceFileOutput = new TraceFile();
traceFileOutput.InitializeAsReplayOutputWriter(@"c:\replayoutput.trc");
replay.OutputFile = traceFileOutput;

2、TraceReplay類還有個比較重要的屬性Options,你可以通過設定Options屬性來控制如何重放。Options屬性是個TraceReplayOptions物件,Profiler工具中重放配置對話方塊上的很多配置項都可以通過Options屬性來設定。下面的程式碼中設定了3個屬性,Mode設定重放模式為連線層面上同步(另一個模式為SequentialReplay,指在所有連線上完全同步),NumberOfReplayThreads設定重放的執行緒數為2,KeepResults將控制在重放結果檔案中是否出現SQL等的執行結果,比如你的trace裡有select 1語句,那設定KeepResults為false將避免在結果檔案中出現select 1返回的result set。

replay.Options.Mode = ReplayMode.ConnectionLevelSync;
replay.Options.NumberOfReplayThreads = 2;
replay.Options.KeepResults = false;

3、TraceReplay類提供了5個事件,你可以通過提供你自己的event handler來進一步控制重放操作,其中最有用的event是ReplayEvent,它將在每個event被重放之前呼叫,你可以控制是否跳過該event的重放。下面的程式碼在設定了ReplayEvent的處理函式後啟動重放。請注意Start函式是同步操作,它將一直阻塞直到重放結束,所以如果你需要在中途停掉的話,你可以在event handler裡或者其它執行緒中呼叫Stop函式。 

replay.ReplayEvent += new ReplayEventHandler(ReplayHandler);
replay.Start();
traceFile.Close();

4、這裡我們的ReplayHandler處理函式將對SPID進行過濾,所有SPID不是54的事件都將被忽略。程式碼中空的catch是為了避免某些event不含有SPID列會造成讀取該列失敗。 

private static void ReplayHandler(Object sender, ReplayEventArgs args)
{
    IDataRecordChanger recordChanger = args.CurrentRecord;
    int spid = 0;
    try
    {
        spid = (int)recordChanger["SPID"];
    }
    catch { }
    if (spid != 54)
        args.SkipRecord = true;
}

5、Replay的結果檔案可以用Profiler工具開啟檢視,當然你仍然可以通過TraceFile開啟,只要簡單的呼叫InitializeAsReader然後迴圈呼叫Read即可,下面的程式碼將打出TextData列的內容。

TraceFile traceFileOutput = new TraceFile();
traceFileOutput.InitializeAsReader(@"c:\replayoutput.trc");
while (traceFileOutput.Read())
{
    Console.WriteLine(traceFileOutput["TextData"]);
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-604315/,如需轉載,請註明出處,否則將追究法律責任。

相關文章