在本篇,我通過使用新建“Session ”對話框來創建新的擴展事件會話。定義一個自己的擴展事件,動作和謂詞,並且發佈一個以收集事件數據為目的的會話。 首先從UI開始 在SQLServer2008R2以後(不包括2008R2),才引入擴展事件的內置UI。2008的版本可以通過安裝插件的形式或者使用T- ...
在本篇,我通過使用新建“Session ”對話框來創建新的擴展事件會話。定義一個自己的擴展事件,動作和謂詞,並且發佈一個以收集事件數據為目的的會話。
首先從UI開始
在SQLServer2008R2以後(不包括2008R2),才引入擴展事件的內置UI。2008的版本可以通過安裝插件的形式或者使用T-sql語句來實現擴展事件。如果是2012以後的SSMS客戶端,也可以訪問2008 的資料庫實例,但是看不到擴展事件UI。在2008版本中缺少UI,意味著必須寫T-SQL和XQuery來挖掘事件數據。2012以後提供了UI來讀取2008版本中的目標文件,同時也能使用UI來進行事件數據分析。
一下的實例都是以SQLServer 2012版進行,為了使用SSMS中的擴展事件,首先在對象瀏覽器中打開Management | Extended Events,在打開Sessions ,看到當前實例的會話時間的列表。打開後你能看到內置的兩個擴展事件,AlwaysOn_health
and system_health
。
圖1
需要註意,擴展時間的優點之一就是事件會話保存於伺服器的元數據中,因此預設重啟後保存在實例中,然而追蹤定義則不是,在重啟後必須要執行一個自定義的存儲過程來重新創建追蹤。擴展事件很好的解決了這些繁瑣的配置。
首先,當我們建好擴展事件以後可以選擇會話—>編寫會話腳本—>Create 到—>新建查詢編輯視窗,得到擴展時間的創建語句。這個語句是與以前我們自己編寫的腳本略有不同的。
其次,SQLServer 包含一個with腳本結尾的一些會話級別的選項。這些選項都是預設的。
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
代碼1
我們使用UI創建一個新的事件會話,行為和屬性,在過程的結束,又將構建這個擴展事件的語句輸出了出來。
在UI創建一個新的事件會話
既可以使用新建會話嚮導或者新建會話。但是,嚮導可選項比較少,因此不推薦使用。所以我們重點介紹新建會話。
創建新的擴展事件,只需要郵件會話的文件夾,然後選擇新建會話…對話框有四個屬性頁:常規,事件,數據存儲和高級。
常規頁
在常規頁,我們可以輸入事件名稱,並且開啟一些選項。這裡我輸入 HighReadQueries
作為名稱,要求名稱必須唯一 。
圖2.常規頁
事件頁
下一步就是加一些事件,切換到事件頁,選擇我們選擇我們打算追蹤的事件並且配置他們。設定合適的操作和謂詞。
添加事件
為了創建一個事件會話,一定要至少有一個事件。下麵例子中,加入了兩個事件,sqlserver.sql_statement_completed
和sqlserver.rpc_completed。這裡可以搜索到所有的事件庫,很多我們已經忘記的。在這個分析器中總共有180個時間供你選擇,找到需要的。下麵再事件庫下麵的輸入框中輸入completed ,下麵的對話框自動將包含這個單詞的事件篩選出來少於15個的事件。
圖3
註意類別/通道這兩個事件的列,基於關鍵字和通道的分類系統,被windows事件追蹤所使用。這裡不深入講解了,理解就行。
雙擊要選中的兩個事件,然後它們出現在右側的列表中:然後點擊配置按鈕,添加動作和謂詞。
圖4
配置事件
事件配置選項由三個tab組成,全局欄位,過濾和事件欄位。
預設收集(事件欄位)
事件欄位標簽展示事件所有列欄位,構成事件的預設收集欄位,有些開銷較大的欄位是可選收集與否的,如下圖的data_stream…
圖5
不同的事件有不同的預設捕捉事件數據。
添加操作
下麵我們可以在全局欄位tab中為兩個事件添加需要的操作。操作也被稱為全局欄位,因為這些欄位不特指任何獨立事件,是公用的。
為了加上操作,只需要選中選擇框。也可以把一個操作加到多個事件上,高亮兩個事件,然後選中操作即可。這裡我們把client_app_name
,
database_id
, server_instance_name
, 和session_id
加到這兩個事件上。
圖6
上述操作是普遍良性的。而擴展事件也提供額一下副作用的操作。例如debug_break欄位就會引起調試中斷。
設定過濾
最後,選擇過濾tab來配置任意謂詞。為了縮短事件估計,阻止擴展事件引擎收集沒必要的數據,需要配置一個謂詞來過濾事件數據。謂詞配置和縮短邏輯是極其重要的。
例如,選中兩個事件,然後從下拉列表選擇logical_reads(邏輯讀),改變操作符列為>=,然後輸入10000。在這種配置下,我們的會話僅僅捕捉sqlstatement 或者存儲過程執行超過時10000的邏輯讀的事件。
圖7
這種選擇多個功能,加入相同的謂詞給兩個事件,限制了可利用的全局欄位和倆個事件的普通欄位。根據時間的選擇,不是所有的欄位都可以使用。例如,加入我們加入error_reported event事件,那麼選擇這三個事件時,邏輯讀這個謂詞就不能使用了。如下圖
圖8
在這個例子中,我們配置相同的謂詞給兩個事件,但是我們也可以靈活的配置每一個事件。
此刻,我們可以選擇OK來創建事件會話完成會話,因為滿足了最低要求。定義事件會話的目標是非必要的。例如,我們配置error_reported
事件加入create_dump_single_thread操作,沒必要保存抓取數據。下麵我們將介紹如何定義目標文件。
數據存儲頁:定義目標文件
選擇數據存儲也然後目標下麵選擇類型,選擇event_file。接著下麵輸入文件名,選擇瀏覽輸入文件的輸出位置。路徑的最大長度是260個字元。例子中使用的是D:\temp\HighReadQueries。這裡不需要包含文件的預設擴展名.xel。擴展事件引擎會附_0_和一個整性數字(文件創建時間到1600年1月1日的秒的數字)來作為文件結尾,保證文件名是唯一的。該文件類型提供了選項來設置最大文件的值,並且允許多次反覆使用文件。如果沒有指定文件最大值,則文件將會增長至填滿驅動為止。
圖9
高級會話選項
在高級選項頁面,能看到額外的高級的會話選項。這裡我們可以今後討論,這裡保持預設即可。
事件會話DDL
選擇OK來完成會話,然後這個會話出現在擴展事件->會話的文件夾下,然後發現他是激活的,因為我們在一開始我們選擇了可選框—創建會話後立即開啟事件會話。生成T-SQL腳本,選擇腳本按鈕點擊OK或者創建完成後右鍵輸出創建腳本到查詢視窗(之前介紹了)。這裡我加上了相應的註釋,以便理解。
/*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
代碼2
與我們之前的代碼很像。除了有會話立即開始,我們還選擇了”捕獲實時在屏幕上監視數據“。一個新的視窗被打開來顯示被事件會話捕捉的數據,就像Profiler做的一樣。但是不同的時,當觀察實時數據引起系統性能問題時,監視器將會自動關閉。
總結
完成後,我們已經熟悉了擴展事件,比如創建基本會話,捕捉一個或者多個事件信息,收集操作的數量,使用簡單的謂詞,寫入文件等等。可視化操作大大減輕了腳本的難度,也提供了很多基礎信息的選擇,大大方便了擴展事件的開發。這塊只是開始應用,希望有大神能指點一下。