SQL Server扩展事件(Extended Events)-- 将现有 SQL 跟踪脚本转换为扩展事件会话

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

SQL Server扩展事件(Extended Events)-- 将现有 SQL 跟踪脚本转换为扩展事件会话

 

如果您具有想要转换为扩展事件会话的现有 SQL 跟踪脚本,则可以使用本主题中的过程创建等效的扩展事件会话。 通过使用 trace_xe_action_map 和 trace_xe_event_map 系统表中的信息,您可以收集进行转换所必需的信息。

 

这些步骤包括以下内容:

    执行现有脚本以便创建一个 SQL 跟踪会话,然后获取该跟踪的 ID。

    运行一个查询,该查询使用 fn_trace_geteventinfo 函数来为每个 SQL 跟踪事件类及其关联列找到等效的扩展事件的事件和操作。

    使用 fn_trace_getfilterinfo 函数列出要使用的筛选器和等效的扩展事件操作。

    手动创建扩展事件会话,并且使用等效的扩展事件的事件、操作和谓词(筛选器)。

 

获取跟踪ID

在查询编辑器中打开 SQL 跟踪脚本,然后执行该脚本以便创建跟踪会话。 请注意,无需运行该跟踪会话即可完成此过程。

获取跟踪的 ID。 为此,请使用以下查询:

 

1
2
SELECT  FROM  sys.traces;
GO

 

注意

跟踪 ID 1 通常指示默认跟踪。

 

确定等效的扩展事件

若要确定等效的扩展事件的事件和操作,请运行以下查询,其中,trace_id 设置为您在之前过程中获取的跟踪 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 和操作名称。 您将在本主题后面的“创建扩展事件会话”过程中使用此输出。

 

在某些情况下,筛选列将映射到默认在扩展事件的事件中包括的事件数据字段。 因此,“Extended_Events_action_name”列将为 NULL。 如果发生此情况,您必须执行以下操作以便确定哪一数据字段等效于筛选列:

 

对于返回 NULL 的操作,标识脚本中哪些 SQL 跟踪事件类包含要筛选的列。

例如,您可能使用了 SP:StmtCompleted 事件类,并且对 Duration 跟踪列名(SQL 跟踪事件类 ID 45 和 SQL 跟踪列 ID 13)指定了一个筛选器。 在此情况下,该操作名称将以 NULL 的形式出现在查询结果中。

对于您在前一步骤中标识的每个 SQL 跟踪事件类,找到等效的扩展事件的事件名称。 (如果您不清楚等效的事件名称,请使用查看与 SQL 跟踪事件类等效的扩展事件主题中的查询。)

使用下面的查询可以标识要用于您在前一步骤中标识的事件的正确的数据字段。 该查询将在“事件字段”列中显示扩展事件数据字段。 在该查询中,用您在前一步骤中指定的事件名称替换 <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”字段。 若要在等效的扩展事件会话中创建该筛选器,您要添加一个谓词,例如“WHERE duration > 0”。

 

创建扩展事件会话

使用查询编辑器可以创建扩展事件会话,并且将输出写入某一文件目标。 下面的步骤描述单个查询,并且提供介绍如何生成查询的说明。 有关完整查询示例,请参阅本主题的“示例”部分。

添加语句以便创建事件会话,并且使用您要用于扩展事件会话的名称替换 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 和持续时间的筛选器。 “确定等效的扩展事件”过程中查询的示例输出返回了以下结果集:

 

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 子句包括。

 

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
)

 

添加异步文件目标,并且使用您要用来保存输出的位置替换文件路径。 在指定文件目标时,必须包括日志文件和元数据文件路径文件。

 

1
2
ADD  TARGET package0.asynchronous_file_target(
SET  filename= 'c:\temp\ExtendedEventsStoredProcs.xel' , metadatafile= 'c:\temp\ExtendedEventsStoredProcs.xem' );

 

查看结果

您可以使用 sys.fn_xe_file_target_read_file 函数查看输出。 为此,运行以下查询,并且使用您指定的路径替换文件路径:

 

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 );

 

注意

将事件数据转换为 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














本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1601048 ,如需转载请自行联系原作者




相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
|
1月前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0
|
2月前
|
SQL 数据库
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)之解决方案
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)之解决方案
293 0
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
存储 SQL Go
全网最长的sql server巡检脚本分享(1000行)
全网最长的sql server巡检脚本分享(1000行)
68 1
|
4月前
|
Java 应用服务中间件 Maven
从零到英雄:一步步构建你的首个 JSF 应用程序,揭开 JavaServer Faces 的神秘面纱
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的 Java EE 标准,用于构建企业级 Web 应用。它提供了丰富的组件库和声明式页面描述语言 Facelets,便于开发者快速开发功能完善且易于维护的 Web 应用。本文将指导你从零开始构建一个简单的 JSF 应用,包括环境搭建、依赖配置、Managed Bean 编写及 Facelets 页面设计。
102 0
|
4月前
|
SQL 关系型数据库 MySQL
【超全整理】SQL日期与时间函数大汇总会:MySQL与SQL Server双轨对比教学,助你轻松搞定时间数据处理难题!
【8月更文挑战第31天】本文介绍了在不同SQL数据库系统(如MySQL、SQL Server、Oracle)中常用的日期与时间函数,包括DATE、NOW()、EXTRACT()、DATE_ADD()、TIMESTAMPDIFF()及日期格式化等,并提供了具体示例。通过对比这些函数在各系统中的使用方法,帮助开发者更高效地处理日期时间数据,满足多种应用场景需求。
480 0
|
4月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
429 0
|
3月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
104 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
22天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。