如果已有要转换为扩展事件会话的现有 SQL 跟踪脚本,则可以使用本主题中的过程创建等效的扩展事件会话。 通过使用trace_xe_action_map和trace_xe_event_map系统表中的信息,可以收集必须执行转换的信息。
这些步骤包括以下内容:
执行现有脚本以创建 SQL 跟踪会话,然后获取跟踪的 ID。
运行一个查询,该查询使用 fn_trace_geteventinfo 函数查找每个 SQL 跟踪事件类及其关联列的等效扩展事件事件和作。
使用 fn_trace_getfilterinfo 函数列出筛选器以及要使用的等效扩展事件作。
使用等效的扩展事件事件、作和谓词(筛选器)手动创建扩展事件会话。
获取跟踪 ID
在查询编辑器中打开 SQL 跟踪脚本,然后执行脚本来创建跟踪会话。 请注意,跟踪会话不需要运行才能完成此过程。
获取跟踪的 ID。 为此,请使用以下查询:
SELECT * FROM sys.traces; GO注释
跟踪 ID 1 通常表示默认跟踪。
确定扩展事件等效项
若要确定等效的扩展事件事件和作,请运行以下查询,其中 trace_id 设置为在上一过程中获取的跟踪 ID 的值。
注释
在此示例中,使用默认跟踪的跟踪 ID(1)。
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 和作名称。 将在本主题后面的“创建扩展事件会话”过程中使用此输出。
在某些情况下,筛选的列映射到扩展事件事件事件中默认包含的事件数据字段。 因此,“Extended_Events_action_name”列将为 NULL。 如果发生这种情况,则必须执行以下作来确定哪些数据字段等效于筛选的列:
对于返回 NULL 的作,请标识脚本中的哪些 SQL 跟踪事件类包含正在筛选的列。
例如,你可能已使用 SP:StmtCompleted 事件类,并指定了持续时间跟踪列名称(SQL 跟踪事件类 ID 45 和 SQL 跟踪列 ID 13)的筛选器。 在这种情况下,作名称将在查询结果中显示为 NULL。
对于在上一步中标识的每个 SQL 跟踪事件类,找到等效的扩展事件事件名称。 (如果不确定等效的事件名称,请使用主题中的查询 查看与 SQL 跟踪事件类等效的扩展事件。
使用以下查询标识用于上一步中标识的事件的正确数据字段。 该查询显示“event_field”列中的“扩展事件”数据字段。 在查询中,将event_name>替换为<在上一步中指定的事件的名称。
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”列将显示事件默认包含的字段。 观察这些字段,可以看到有一个“持续时间”字段。 若要在等效的扩展事件会话中创建筛选器,需要添加谓词,例如“WHERE duration > 0”。 有关示例,请参阅本主题中的“创建扩展事件会话”过程。
创建扩展事件会话
使用查询编辑器创建扩展事件会话,并将输出写入文件目标。 以下步骤介绍了单个查询,其中说明了如何生成查询。 有关完整查询示例,请参阅本主题的“示例”部分。
添加语句以创建事件会话,将s ession_name 替换为要用于扩展事件会话的名称。
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:StmtStarting 和 SP:StmtCompleted 事件类的 SQL 跟踪脚本,以及会话 ID 和持续时间的筛选器。 “确定扩展事件等效项”过程中查询的示例输出返回了以下结果集:
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若要将其转换为扩展事件的等效项,就会添加sqlserver.sp_statement_starting和sqlserver.sp_statement_completed事件,并附带一系列操作列表。 谓词语句被包含在 WHERE 子句中。
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');
查看结果
可以使用 sys.fn_xe_file_target_read_file 函数查看输出。 为此,请运行以下查询,将文件路径替换为指定的路径:
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);注释
将事件数据转换为 XML 是可选的。
有关sys.fn_xe_file_target_read_file函数的详细信息,请参阅 sys.fn_xe_file_target_read_file (Transact-SQL)。
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');
示例:
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');