SQL Server扩展事件(Extended Events)-- 将现有 SQL 跟踪脚本转换为扩展事件会话
SQL Server擴展事件(Extended Events)-- 將現(xiàn)有 SQL 跟蹤腳本轉(zhuǎn)換為擴展事件會話
?
如果您具有想要轉(zhuǎn)換為擴展事件會話的現(xiàn)有 SQL 跟蹤腳本,則可以使用本主題中的過程創(chuàng)建等效的擴展事件會話。 通過使用 trace_xe_action_map 和 trace_xe_event_map 系統(tǒng)表中的信息,您可以收集進行轉(zhuǎn)換所必需的信息。
?
這些步驟包括以下內(nèi)容:
????執(zhí)行現(xiàn)有腳本以便創(chuàng)建一個 SQL 跟蹤會話,然后獲取該跟蹤的 ID。
????運行一個查詢,該查詢使用 fn_trace_geteventinfo 函數(shù)來為每個 SQL 跟蹤事件類及其關(guān)聯(lián)列找到等效的擴展事件的事件和操作。
????使用 fn_trace_getfilterinfo 函數(shù)列出要使用的篩選器和等效的擴展事件操作。
????手動創(chuàng)建擴展事件會話,并且使用等效的擴展事件的事件、操作和謂詞(篩選器)。
?
獲取跟蹤ID
在查詢編輯器中打開 SQL 跟蹤腳本,然后執(zhí)行該腳本以便創(chuàng)建跟蹤會話。 請注意,無需運行該跟蹤會話即可完成此過程。
獲取跟蹤的 ID。 為此,請使用以下查詢:
?
| 1 2 | SELECT?*?FROM?sys.traces; GO |
?
注意
跟蹤 ID 1 通常指示默認跟蹤。
?
確定等效的擴展事件
若要確定等效的擴展事件的事件和操作,請運行以下查詢,其中,trace_id 設(shè)置為您在之前過程中獲取的跟蹤 ID 的值。
?
注意
在這個示例中,使用默認跟蹤 (1) 的跟蹤 ID。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 | USE?MASTER; GO DECLARE?@trace_id?int; SET?@trace_id?=?1; SELECT?DISTINCT?el.eventid,?em.package_name,?em.xe_event_name?AS?'event' ,?el.columnid,?ec.xe_action_name?AS?'action' FROM?(sys.fn_trace_geteventinfo(@trace_id)?AS?el LEFT?OUTER?JOIN?sys.trace_xe_event_map?AS?em ON?el.eventid?=?em.trace_event_id) LEFT?OUTER?JOIN?sys.trace_xe_action_map?AS?ec ON?el.columnid?=?ec.trace_column_id WHERE?em.xe_event_name?IS?NOT?NULL?AND?ec.xe_action_name?IS?NOT?NULL; |
?
將返回等效的擴展事件的事件 ID、包名稱、事件名稱、列 ID 和操作名稱。 您將在本主題后面的“創(chuàng)建擴展事件會話”過程中使用此輸出。
?
在某些情況下,篩選列將映射到默認在擴展事件的事件中包括的事件數(shù)據(jù)字段。 因此,“Extended_Events_action_name”列將為 NULL。 如果發(fā)生此情況,您必須執(zhí)行以下操作以便確定哪一數(shù)據(jù)字段等效于篩選列:
?
對于返回 NULL 的操作,標識腳本中哪些 SQL 跟蹤事件類包含要篩選的列。
例如,您可能使用了 SP:StmtCompleted 事件類,并且對 Duration 跟蹤列名(SQL 跟蹤事件類 ID 45 和 SQL 跟蹤列 ID 13)指定了一個篩選器。 在此情況下,該操作名稱將以 NULL 的形式出現(xiàn)在查詢結(jié)果中。
對于您在前一步驟中標識的每個 SQL 跟蹤事件類,找到等效的擴展事件的事件名稱。 (如果您不清楚等效的事件名稱,請使用查看與 SQL 跟蹤事件類等效的擴展事件主題中的查詢。)
使用下面的查詢可以標識要用于您在前一步驟中標識的事件的正確的數(shù)據(jù)字段。 該查詢將在“事件字段”列中顯示擴展事件數(shù)據(jù)字段。 在該查詢中,用您在前一步驟中指定的事件名稱替換 <event_name>。
?
| 1 2 3 4 5 6 7 8 9 10 11 | SELECT?xp.name?package_name,?xe.name?event_name ,xc.name?event_field,?xc.description FROM?sys.trace_xe_event_map?AS?em INNER?JOIN?sys.dm_xe_objects?AS?xe ON?em.xe_event_name?=?xe.name INNER?JOIN?sys.dm_xe_packages?AS?xp ON?xe.package_guid?=?xp.guid?AND?em.package_name?=?xp.name INNER?JOIN?sys.dm_xe_object_columns?AS?xc ON?xe.name?=?xc.object_name WHERE?xe.object_type?=?'event'?AND?xc.column_type?<>?'readonly' AND?em.xe_event_name?=?'<event_name>'; |
?
例如,SP:StmtCompleted 事件類映射到 sp_statement_completed 擴展事件的事件。 如果您在查詢中將 sp_statement_completed 指定為事件名稱,則“event_field”列將顯示默認隨該事件包括的字段。 在查看這些字段時,您會看到有一個“duration”字段。 若要在等效的擴展事件會話中創(chuàng)建該篩選器,您要添加一個謂詞,例如“WHERE duration > 0”。
?
創(chuàng)建擴展事件會話
使用查詢編輯器可以創(chuàng)建擴展事件會話,并且將輸出寫入某一文件目標。 下面的步驟描述單個查詢,并且提供介紹如何生成查詢的說明。 有關(guān)完整查詢示例,請參閱本主題的“示例”部分。
添加語句以便創(chuàng)建事件會話,并且使用您要用于擴展事件會話的名稱替換 ession_name。
?
| 1 2 3 4 | IF?EXISTS(SELECT?*?FROM?sys.server_event_sessions?WHERE?name='session_name') DROP?EVENT?SESSION?[Session_Name]?ON?SERVER; CREATE?EVENT?SESSION?[Session_Name] ON?SERVER; |
?
添加在“確定等效的擴展事件”過程中作為輸出返回的擴展事件的事件和操作,并且添加在“確定在腳本中使用的篩選器”過程中標識的謂詞(篩選器)。
?
下面的示例使用一個 SQL 跟蹤腳本,該腳本包括 SQL:StmtStarting 和 SP:StmtCompleted 事件類,以及用于會話 ID 和持續(xù)時間的篩選器。 “確定等效的擴展事件”過程中查詢的示例輸出返回了以下結(jié)果集:
?
Eventid package_name event columnid action
44 sqlserver sp_statement_starting 6 nt_username
44 sqlserver sp_statement_starting 9 client_pid
44 sqlserver sp_statement_starting 10 client_app_name
44 sqlserver sp_statement_starting 11 server_principal_name
44 sqlserver sp_statement_starting 12 session_id
45 sqlserver sp_statement_completed 6 nt_username
45 sqlserver sp_statement_completed 9 client_pid
45 sqlserver sp_statement_completed 10 client_app_name
45 sqlserver sp_statement_completed 11 server_principal_name
45 sqlserver sp_statement_completed 12 session_id
?
為了將此結(jié)果集轉(zhuǎn)換為等效的擴展事件,添加了 sqlserver.sp_statement_starting 和 sqlserver.sp_statement_completed 事件以及操作列表。 謂詞語句作為 WHERE 子句包括。
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ADD?EVENT?sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE?sqlserver.session_id?=?59 ), ADD?EVENT?sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE?sqlserver.session_id?=?59?AND?duration?>?0 ) |
?
添加異步文件目標,并且使用您要用來保存輸出的位置替換文件路徑。 在指定文件目標時,必須包括日志文件和元數(shù)據(jù)文件路徑文件。
?
| 1 2 | ADD?TARGET?package0.asynchronous_file_target( SET?filename='c:\temp\ExtendedEventsStoredProcs.xel',?metadatafile='c:\temp\ExtendedEventsStoredProcs.xem'); |
?
查看結(jié)果
您可以使用 sys.fn_xe_file_target_read_file 函數(shù)查看輸出。 為此,運行以下查詢,并且使用您指定的路徑替換文件路徑:
?
| 1 2 | SELECT?*,?CAST(event_data?as?XML)?AS?'event_data_XML' FROM?sys.fn_xe_file_target_read_file('c:\temp\ExtendedEventsStoredProcs*.xel',?'c:\temp\ExtendedEventsStoredProcs*.xem',?NULL,?NULL); |
?
注意
將事件數(shù)據(jù)轉(zhuǎn)換為 XML 是可選的。
?
示例
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | IF?EXISTS(SELECT?*?FROM?sys.server_event_sessions?WHERE?name='session_name') DROP?EVENT?SESSION?[session_name]?ON?SERVER; CREATE?EVENT?SESSION?[session_name] ON?SERVER ADD?EVENT?sqlserver.sp_statement_starting (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE?sqlserver.session_id?=?59 ), ADD?EVENT?sqlserver.sp_statement_completed (ACTION ( sqlserver.nt_username, sqlserver.client_pid, sqlserver.client_app_name, sqlserver.server_principal_name, sqlserver.session_id ) WHERE?sqlserver.session_id?=?59?AND?duration?>?0 ) ADD?TARGET?package0.asynchronous_file_target (SET?filename='c:\temp\ExtendedEventsStoredProcs.xel',?metadatafile='c:\temp\ExtendedEventsStoredProcs.xem'); |
?
參考:
http://technet.microsoft.com/zh-cn/library/ff878264%28v=sql.110%29.aspx
本文轉(zhuǎn)自UltraSQL51CTO博客,原文鏈接:http://blog.51cto.com/ultrasql/1601048 ,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的SQL Server扩展事件(Extended Events)-- 将现有 SQL 跟踪脚本转换为扩展事件会话的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11g crsctl start/sto
- 下一篇: 设置电脑背景颜色为保护眼睛的颜色