SQL Server Extended Events 進階 2:使用UI建立基本的事件會話

第一階中咱們描述瞭如何在Profiler中自定義一個Trace,而且讓它運行在服務器端來建立一個Trace文件。而後咱們經過Jonathan Kehayias的 sp_SQLskills_ConvertTraceToExtendedEvents存儲過程,將Trace定義轉換爲建立Extended Events 會話的腳本。但願它爲你創建起了一座由SQL Trace 通向Extended Events開始的橋樑。固然,它也提供了一個將已有SQL Trace庫轉換爲Extend Events的有效途徑。sql

然而,當咱們須要建立一個新的Extended Events會話時改怎麼辦呢,從頭開始?是的,咱們我可使用T-Sql定義會話,可是在SQL Server2012及之後版本中,UI工具已經集成在SSMS中,咱們可使用它定義事件會話,開始,中止它們,同時也能夠直接在SMSS UI上直接使用和分析這些數據。數據庫

在這一階中,咱們將介紹New Session對話框的基本使用方法,使用它建立一個新的事件會話,定義它的事件,Actions和謂詞,而且創建一個事件會話的目標用於收集事件的數據。瀏覽器

從UI開始

在SQL server 2008以及SQL Server 2008R2中並無爲Extended Events集成的UI。若是你正使用這些版本,你能夠選擇使用T-SQL定義事件會話,或者安裝 Jonathan Kehayias的SSMS插件(http://extendedeventmanager.codeplex.com/))。若是你使用2012 Management Studio,你能夠鏈接SQL Server的早期版本,可是對於2008 和2008R2 版本的實例,你並不能找到Extended Events UI。Jonathan 爲SSMS 2012 提供了一個獨立的插件,它提供了一個簡單的UI用與鏈接2008和2008R2。服務器

因爲在SQL server 2008和2008R2缺乏UI,這也意味着咱們必須使用T-SQL和XQuery來處理事件數據。然而幸運的是在SQL server 2012的UI中咱們能夠讀取由2008和2008R2生成的目標文件,所以值得安裝SSMS 2012和使用它的UI分析事件數據。session

爲了這一階剩餘的部分便於理解,我假設你正在使用SQL Server 2012及以上版本UI。爲了在SSMS中訪問Extended Events,請展開SQL實例,在對象瀏覽器中,切換至Management | Extended Events,並展開Sessions,咱們能夠看到實例中已存在的事件會話。app

若是你已經完成了第一階,你應該能夠看到兩個內置的Extended Events會話AlwaysOn_health 和system_health,加上咱們建立的 XE_ReadsFilter_Trace會話。ide

Figure 1: Viewing event sessions in the SSMS UI工具

就像咱們在第一階中所說起的,Extended events的好處之一就是會話定義被保存在服務器元數據中,即便實例被重啓也是被持久化的。Trace的定義卻不是這樣,咱們不得不實現一個自定義的存儲過程,用於在實例重啓後再次建立Trace。sqlserver

咱們也能夠有不少事件會話,但卻不激活它們。這點雖在Trace中也是可行的,可是咱們一般不會這樣用,這多是因爲輸出目標文件名是硬編碼在Trace定義中的。當咱們想要中止或重啓Trace時,咱們須要保證輸出文件在啓動前被刪除,或爲Trace設置滾動文件更新。Extended Events解決了這一問題,咱們在這一階中 數據存儲頁:定義目標中介紹。性能

XE_ReadsFilter_Trace 會話上右鍵菜單中選擇Script Session as | CREATE TO | New Query Editor Window,事件會話定義會被輸出至一個新的查詢窗口,如Listing1所示。這段代碼與在第一階中使用sp_SQLskills_ConvertTraceToExtendedEvents所生成的功能相同。然而你會注意到這裏有一些細小的不一樣點。首先,這個SQL Server存儲的腳本定義中已經再也不包含那些用於映射SQL Trace列的代碼註釋了。
其次,SQL Server在腳本末尾的With子句中包含了一些咱們沒有見過的額外的選項(在下一階中介紹)。全部會話選項都是默認值,這也是在再第一階中 Trace轉化中沒有生成他們的緣由。

CREATE EVENT SESSION [XE_ReadsFilter_Trace] ON SERVER
ADD EVENT sqlserver.rpc_completed (
    ACTION ( sqlserver.client_app_name
    , sqlserver.database_id
    , sqlserver.server_instance_name
    , sqlserver.session_id
   )
    WHERE 
   ( logical_reads >= 10000 ) ),
ADD EVENT sqlserver.sql_statement_completed (
    ACTION ( sqlserver.client_app_name
    , sqlserver.database_id
    , sqlserver.server_instance_name
    , sqlserver.session_id
   )
    WHERE 
   ( logical_reads >= 10000 ) )
ADD TARGET package0.event_file (  SET filename = 'C:\temp\XE_ReadsFilter_Trace.xel' ,
                                  max_file_size = ( 5 ) ,
                                  max_rollover_files = ( 1 ) )
WITH (  MAX_MEMORY = 4096 KB ,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS ,
        MAX_DISPATCH_LATENCY = 30 SECONDS ,
        MAX_EVENT_SIZE = 0 KB ,
        MEMORY_PARTITION_MODE = NONE ,
        TRACK_CAUSALITY = OFF ,
        STARTUP_STATE = OFF )
GO

Listing 1: Scripting out the existing XE_ReadsFilter_Trace event session

咱們接下來使用UI來建立一個與XE_ReadsFilter_Trace具備相同的事件,Actions,謂詞的事件會話,可是不一樣名。在這個過程的最後,我會講述如何將咱們在UI上完成的功能定義,轉爲SQL Server 生成的T-SQL腳本。

在UI上建立一個新的事件會話

咱們能夠是使用New Session Wizard嚮導或New Session對話框來建立事件會話。然而,這個嚮導只是New Session對話框中選項的一個子集,所以它不是頗有用。於是,咱們着重關注New Session對話框。

建立一個Extended Events會話,只需右鍵點擊Sessions 文件夾並選擇New Session...。一個具備四個屬性頁的New Session對話框會顯示出來,四個屬性頁分別是:General,Evetns,Data Storage和Advanced,咱們從General頁開始。

基本會話屬性

在會話General屬性頁上,咱們能夠輸入一個會話名稱。開啓一些會話的其餘選項,如建立完成後當即啓動,咱們可使用顯示實時視圖查看事件數據。
輸入會話名稱,如「HighReadQueries 」來區別咱們在第一階中建立的會話,會話名稱必須是惟一的。

Figure 2: The General properties page of the New Session dialog

若是你看不到Causality tracking這個選項多是由於對話框過小了,這個高級選項不會再這涵蓋在這一階中。一個正確是UI設計應該是顯示一個下拉條以防咱們不能看到整個屏幕。

Events 頁

下一步是向咱們的會話中添加一些事件。這個例子中,咱們想要添加兩個事件sqlserver.sql_statement_completed和sqlserver.rpc_completed。Events頁中我惟一喜歡的是咱們能夠搜索事件庫。我敢打賭你曾經花過幾分鐘,幾小時,甚至幾天時間在Profiler的事件列表中查看那180個事件,僅僅爲了一個你所須要的事件。在Extended Events UI上這已再也不是問題了,咱們能夠根據事件名稱,描述,事件字段或者所有條件來搜索。
在事件庫的文本框中輸入completed,對話框會動態過濾這個列表,最後僅剩15個事件。

Figure 3: Handy event name filtering when searching the event library

請注意 Category/Channel 這兩種事件分類,它們是基於Windows 系統Events Tracing的Keyword/Channel分類。咱們不會在這一階討論。

在這咱們不會看到全部的"_completed"事件,默認設置中,UI不會顯示Debug Channel事件。選擇Channel下拉框,你會看到Debug沒有被選中。若是你啓用它,你會看到更多的_completed事件粗線在列表中,Debug事件是爲微軟內部在生產環境下使用的。一些專家可能會使用他們作高級的故障診斷,或者爲了更好的理解SQL Server內部的工做機制。然而,微軟並不爲這種方式提供支持,也不保證他們的行爲,這些事件也可能在下一個release中被刪除或更改。

雙擊rpc_completed 和sql_statement_completed 事件,他們會出如今Selected events面板中,而後選擇Configure按鈕爲這些事件添加Actions和謂詞。

Figure 4: Adding events to the event session

這是New Session對話框中我不喜歡的一點:配置事件不在同一面板中,必須點擊Configure按鈕來切換到Action和謂詞選項。

配置事件

事件配置選項中有三個標籤頁:Global Fields (Actions), Filter (Predicate) and Event Fields。

默認負載(Event Fields)

Event Fields標籤頁顯示了事件默認負載的事件字段(數據列)。

Figure 5: The default payload for an event

切換這兩個事件你會看到不一樣的時間默認捕獲的數據也不相同。大多數的字段不能從這個集合中移除,可是那些帶有複選框的是可選的。例如,以pc_completed事件爲例,statement 是可選的,可是默認會被收集,而output_parameters 字段也是可選的可是默認不會被收集。
不要對Event Fields作改動,保持他們收集事件正常的,默認的負載。

添加Actions

如今讓咱們根據休要來添加Actions,選擇Global Fields(Acrtions)標籤頁。Actions 頁被稱爲全局字段,由於這些字段並非屬於任何單獨事件的。
添加Actions到事件中僅須要勾選列名前的複選框。想要爲多個事件添加Actions, 能夠在左邊同時選中多個事件。這個例子中,咱們須要爲這兩個事件添加client_app_name, database_id, server_instance_name, 和session_id。

Figure 6: Adding actions to event

上述選擇的Actions在收集字段的場景中是很是友好的,僅僅提供額外事件的詳細信息。
Extended Events也提供了一些具備反作用Actions,爲稱爲side-effecting actions。例如,debug_break 當事件觸發時,會觸引發調試中斷。create_dump_all_threads和create_dump_single_thread分別會形成SQL Server爲全部線程或單個線程建立內存Dump。數據庫引擎在同一線程中執行這些Action,所以這些Actions可能急劇影響性能,咱們應該當心使用它們,咱們會在下一階中進一步討論。

設置過濾(謂詞)

最後咱們選擇Filter (Predicate)標籤頁來設置謂詞。盡在少數例外狀況下,你才應該爲每一個事件單獨配置謂詞。爲了"short-circuit"(短路)事件判斷,防止Extended Events引擎收集不須要的數據而形成的沒必要要的開銷。謂詞配置和"short-circuit"邏輯是很是重要的,咱們會在下一階中詳細介紹。

這個例子中,選中這兩個事件,從Filed下拉框中選擇logical_reads,而後運算色湖之爲大於等於,並在Value中設置10000。使用這個配置,咱們的事件會話僅捕獲那些執行過程消費大於10000個邏輯讀的SQL語句或存儲過程。

Figure 7: Adding a predicate

這個多選功能,爲了使每一個事件能夠添加相同的謂詞,Field下拉框中僅顯示兩個事件所共有的字段和Global字段。根據選擇的事件,並非全部的字段可選。例如,若是咱們添加了 error_reported事件,而後選擇這三個事件,咱們在謂詞選項中就不會在看到logical_reads ,如圖8所示。

Figure 8: Adding a predicate to multiple events at the same time

這個例子中,咱們爲兩個事件設置了相同的謂詞,固然咱們也有足夠的靈活性爲每一個事件設置不一樣的謂詞,這點事在SQL Trace中沒法完成的。

此時的事件會話配置,咱們就能夠選擇OK來建立會話了,由於只有添加至少一個事件是必須的條件。爲會話指定目標文件並非必要條件。

數據存儲頁:定義一個目標

選擇Data Storage頁並選擇一個Event_file類型的目標。在File name on server文本框最後選擇「Browse...」並選擇目標輸出文件路徑。在2008和2008R2中,須要指定兩個文件,一個爲了日誌數據(例如真正的事件數據),另一個爲元數據(用來描述日誌文件中文件內容,所以事件和Actions能夠被正確的轉換)。在SQL Server 2012和更高版本中,只有一個文件被用到。

在SQL Server 2012中,完整的log文件夾路徑顯示在UI上(如: C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Log);在SQL Server 2014中僅僅顯示一個文件名,可是SQL Server默認使用log文件夾路徑。

文件名最大字符長度爲260,在咱們的例子中,咱們使用C:\temp\HighReadQueries。並不須要爲目標文件提供文件擴展名(.xel)。

Extended Event引擎會附加 _0_和一個整數(文件建立時間日期到1600-1-1所間隔的毫秒數)在文件名末尾來保證文件名老是惟一的。這與SQL很是不一樣,咱們已經討論過Trace文件名須要定義在Trace定義中。

event_file 目標提供了以MB設置最大文件大小,並容許滾動文件更新。若是你不指定文件最大值,文件會一直增加直至填滿硬盤。

 

Figure 9: Selecting and configuring a target

高級會話選項

在Advanced頁中,咱們能夠設置額外的高級會話選項。咱們在下一階中詳細覆蓋這些選項,這裏不作講解。在任何狀況下,爲了跟Level 1中建立的事件會話保持一致,咱們會保持這些選項的默認值。

事件會話DDL

選擇OK來建立會話,它會出如今Extended Events | Sessions 文件夾下,而且是Active狀態,應爲咱們在General面板中勾選了"Start the event session immediately after session creation"。如需爲事件會話生成T-SQL腳本,能夠點擊OK前選擇UI上的Script按鈕,也能夠在建立會話後右鍵選擇HighReadQueries,並選擇「Script Session as」來生成腳本。在Listing2中,我已經爲New Session建立的DDL腳本的每一個段落添加了註釋。

/*Create the session, named as specified on the General page*/
CREATE EVENT SESSION [HighReadQueries] ON SERVER

/*Add and configure events, actions and predicates, as specified on the Events page*/
ADD EVENT sqlserver.rpc_completed (  
    ACTION ( sqlserver.client_app_name,
      sqlserver.database_id,
      sqlserver.server_instance_name,
      sqlserver.session_id )
    WHERE ( [logical_reads] >= ( 10000 ) ) ),
ADD EVENT sqlserver.sql_statement_completed (  
    ACTION ( sqlserver.client_app_name,
      sqlserver.database_id,
      sqlserver.server_instance_name,
      sqlserver.session_id )
    WHERE ( [logical_reads] >= ( 10000 ) ) )

/*Add and configure a target, as specified on the Data Storage page*/
ADD TARGET package0.event_file ( SET filename = N'C:\temp\HighReadQueries' )

/* Set Session-level options, specified on the General and Advanced pages*/
WITH ( MAX_MEMORY = 4096 KB ,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS ,
        MAX_DISPATCH_LATENCY = 30 SECONDS ,
        MAX_EVENT_SIZE = 0 KB ,
        MEMORY_PARTITION_MODE = NONE ,
        TRACK_CAUSALITY = OFF ,
        STARTUP_STATE = ON );
GO

Listing 2: The event session DDL for HighReadQueries

這段代碼與咱們在Listing1 中所見的XE_ReadsFilter_Trace會話幾乎一致。另外爲了馬上啓動會話,咱們也選擇了「Watch live data on the screen as it is captured」。在SSMS中一個用戶顯示會話數據的窗口會被打開,就像在Profiler UI上同樣。這裏一個重要的提高是,若是查看實時數據開銷影響到系統性能時,查看器的鏈接會被自動斷開。

總結

完成這一階後,你應該對在SSMS中建立一個基本的會話很熟悉了,你能夠捕獲一個或多個事件,收集一系列的Actions,使用簡單的謂詞並保存數據到文件中。這些配置與在PRofiler或Trace中捕獲信息是類似的,卻又不相同。

下一階中,咱們會進一步深刻extended events基礎,使你能夠從基本的數據收集轉向高級配置和捕獲。

相關文章
相關標籤/搜索