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

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

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
相关文章
|
3月前
|
SQL 开发框架 .NET
突破T-SQL限制:利用CLR集成扩展RDS SQL Server的功能边界
CLR集成为SQL Server提供了强大的扩展能力,突破了T-SQL的限制,极大地拓展了SQL 的应用场景,如:复杂字符串处理、高性能计算、图像处理、机器学习集成、自定义加密解密等,使开发人员能够利用 .NET Framework的丰富功能来处理复杂的数据库任务。
|
5月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
6月前
|
存储 SQL Go
全网最长的sql server巡检脚本分享(1000行)
全网最长的sql server巡检脚本分享(1000行)
117 1
|
6月前
|
SQL 存储 Go
SQL Server一键巡检脚本分享
SQL Server一键巡检脚本分享
127 0
|
6月前
|
SQL 运维 Oracle
SQL Server 项目中 SQL 脚本更新、升级方式,防止多次重复执行
SQL Server 项目中 SQL 脚本更新、升级方式,防止多次重复执行
98 0
|
9月前
|
SQL 分布式计算 测试技术
使用UDF扩展Spark SQL
使用UDF扩展Spark SQL
|
9月前
|
SQL 存储 Kubernetes
对 K8s 异常事件的定时 SQL 分析
K8s 是基于状态机的设计,在不同状态之间迁移时会生成事件。正常的状态间转换会生成 Normal 事件,从正常状态转换为异常状态则会生成 Warning 事件。使用 K8s 集群,我们关注业务、容器、集群三个层面稳定性,最基础的依赖是 K8s node 要稳定。可能影响 pod 运行的节点问题包括:...
131 0
对 K8s 异常事件的定时 SQL 分析
|
5月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
138 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
1月前
|
数据库 Windows
SqlServer数据恢复—SqlServer数据库所在分区损坏的数据恢复案例
一块硬盘上存放的SqlServer数据库,windows server操作系统+NTFS文件系统。由于误操作导致分区损坏,需要恢复硬盘里的SqlServer数据库数据。
|
3月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第16天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括配置系统源、安装 SQL Server 2019 软件包以及数据库初始化,确保 SQL Server 正常运行。
156 4