標籤:profiler 異常 trace exception attention
SQL Server Profiler -- 識別異常
在一個完美的環境中,所有的異常都應該可以被捕捉、處理並記錄。有專人定期查看這些日誌並建立基於發生的異常的錯誤報表,使它們可以被及時調試並在將來多能避免再次發生。然而,現實總是可以看到應用程式從資料庫到使用者介面都會不斷地出現各種異常,並且這些異常都沒有任何記錄。更糟糕的是,應用程式搜尋到並消化了這些異常,偶爾也會給使用者返回奇怪的資料,而這些使用者並不明白髮生了什麼。為了查明這些情況通常提出分析觀察這些異常,以便能夠尋找並處理這些異常,避免影響太多使用者。
跟蹤異常十分簡單,可以從TSQL模板開始,該模板包括審核登入和審核登出事件以及現存串連事件(這裡可以將所有事件都可以移除)。剩下的就是“RPC:Starting”和“SQL:BatchStarting”,這兩者都是必須的,用來跟蹤引發一個異常的Transact-SQL,不管這個異常是由於SQL批處理還是由於RPC調用引起的。在這種情況下,跟蹤啟動事件更為重要,而不是去跟蹤完成事件,因為某些錯誤可能導致完成事件無法激發一個給定的查詢。
650) this.width=650;" title="clip_image001" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image001" src="http://s3.51cto.com/wyfs02/M02/56/AC/wKioL1SKi-Gwb-oaAAHqNVOodBs252.jpg" border="0" height="537" />
還要往RPC和SQL事件中添加錯誤和警告類別中的注意、異常和使用者錯誤資訊事件。每當一個客戶強行中斷連線時,注意事件就會被激發,最好的例子就是用戶端查詢逾時,通常暗示效能或阻塞問題。每當一個任意類型的異常發生時,例外狀況事件就會被激發,而當與一個異常合在一起,以訊息形式送回關於鎖發生事件的額外資料時,使用者錯誤資訊事件就會被激發,或者當一系列狀態改變時,該事件也會被激發,如使用者從一個資料庫切換到另一個資料庫。
我們也建議為每個選擇事件類別都添加一個EventSequence列,這將使稍後的查詢資料更加簡便。建議用來監視異常的一個事件和列的完成事件選擇對話方塊如下。
650) this.width=650;" title="clip_image002" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image002" src="http://s3.51cto.com/wyfs02/M00/56/AC/wKioL1SKi-Ky-SmMAAKCzfUTAQo129.jpg" border="0" height="537" />
注意:SQL Server在查詢執行進程的各個階段內部使用異常來發送資訊。它的一個警示標誌就是沒有相應的使用者錯誤資訊事件的一個例外狀況事件。如果出現此類情況,並不需要使用者處理錯誤。
在選擇了合適的事件後,就可以編輯跟蹤並啟動此事件了。使用者可能要在後台運行這類跟蹤,做一些臨時收集。通常情況下,在活動忙碌期間收集該資料十分重要,它可以協助尋找使用者可能遇到的異常。比如捕捉一些特別的東西來,這類跟蹤更像是撒網並希望趕上一些什麼,因此計時是必不可少的。使用者可能會發現異常,也可能發現不了,但是僅僅因為在一個收集期內沒有發現異常就不能認為沒有異常,所以要確保經常監視異常。
如果捕捉到資料並將其傳送到一張表裡,尋找發生的異常就是一個問題了:
1. 在先於中斷連線的同一個spid上的所有注意事件(事件類別16),以及Transact-SQL或RPC事件(事件類別分別是13和10)。
2. 所有例外狀況事件(事件類別33)和緊隨其後的一個使用者錯誤資訊事件(事件類別162),以及在先於異常的同一個spid上的Transact-SQL或RPC事件。
所有前後相隨的邏輯都可以用EventSequence列編碼,建議在跟蹤管理加入這個列。下面的查詢使用這個邏輯尋找出所有的使用者異常和中斷連線、相關錯誤資訊及造成故障的查詢:
;WITH Exceptions AS(SELECTT0.SPID,T0.EventSequence,COALESCE(T0.TextData, ‘Attention’) AS Exception,T1.TextData AS MessageTextFROM TraceTable T0LEFT OUTER JOIN TraceTable T1 ONT1.EventSequence = T0.EventSequence + 1AND T1.EventClass = 162WHERET0.EventClass IN (16,33)AND (T0.EventClass = 16 OR T1.EventSequence IS NOT NULL))SELECT *FROM ExceptionsCROSS APPLY(SELECT TOP(1)TextData AS QueryTextFROM TraceTable QueriesWHEREQueries.SPID = Exceptions.SPIDAND Queries.EventSequence < Exceptions.EventSequenceAND Queries.EventClass IN (10,13)ORDER BY EventSequence DESC) p
如果已經收集了大量的事件,就可以通過在跟蹤表上的EventSequence列建立索引來提高查詢的效能。
提示:如果已經意識到調用某一預存程序會發生一種異常,但是還需要更多的資訊來確定到底這些事件在什麼順序下會激發這個異常,就可能需要結合之前所述的相同事件對單個查詢做效能調校了。將查詢事件以完成改到相應的啟動類,並添加異常和使用者錯誤資訊事件,與調校單個查詢的例子類似,這也需要和正在工作的spid上的過濾器一起,直接在SQL Server效能分析器中運行。
本文出自 “SQL Server Deep Dives” 部落格,請務必保留此出處http://ultrasql.blog.51cto.com/9591438/1589292
SQL Server Profiler -- 識別異常