浏览扩展事件
Azure SQL 中的扩展事件引擎是一个功能强大的轻型监视系统,可让你捕获有关数据库和服务器中的活动的详细信息。 Azure 平台上的监视解决方案使你能够轻松地为环境配置强大的监视,并提供对错误条件的自动响应。
扩展事件以 SQL Server Profiler 功能为基础而构建,使你可以跟踪查询并公开可监视的其他数据(事件)。 可以使用扩展事件进行故障排除的问题的一些示例包括:
- 阻止和死锁性能问题故障排除。
- 识别长时间运行的查询。
- 监视数据定义语言 (DDL) 操作。
- 记录缺失列统计信息。
- 观察数据库中的内存压力。
- 长时间运行的物理 I/O 操作。
扩展事件框架还允许使用筛选器限制收集的数据量以减少数据收集的开销,并使你可以通过侧重于特定区域来更轻松识别性能问题。
下面是在 Azure SQL 数据库上创建的扩展事件会话示例:
在上图中,xe_deadlocks 是在 AdventureWorks 数据库(图像左侧)上运行的扩展事件会话的名称。 事件会话节点下的 event_counter 目标节点对事件会话中每个事件的出现次数进行计数。 若要查看 SSMS 对象资源管理器中的目标数据,可以右键单击目标节点,然后选择“查看目标数据”。 SSMS 显示数据(如图像左侧所示),以及每个事件的计数结果。
有关 Azure SQL 数据库上扩展事件的信息,请参阅 Azure SQL 数据库中的扩展事件。
可以使用扩展事件监视哪些内容?
扩展事件涵盖 SQL Server 的完整外围应用,划分为四个通道,它们定义了事件的受众。
- 管理 - 管理事件面向最终用户和管理员。 包括的事件指示管理员可以执行的一组定义完善的操作中存在问题。 这种情况的一个示例是生成 XML 死锁报告,以帮助识别死锁的根本原因。
- 操作 - 操作事件用于分析和诊断或常见问题。 这些事件可以用于根据事件的发生来触发操作或任务。 操作事件的一个示例是数据库处于可用性组更改状态,这指示进行了故障转移。
- 分析 - 分析事件通常与性能事件相关,会大量发布。 跟踪存储过程或查询执行是分析事件的一个示例。
- 调试 - 调试事件不一定会完整记录,仅当与 Microsoft 支持人员一起进行故障排除时,才应使用它们。
事件会添加到会话中,而会话可以托管多个事件。 通常,多个事件会在一个会话中分组在一起,以捕获相关信息集。
可以运行以下查询以获取可用事件、操作和目标的列表:
SELECT
obj.object_type,
pkg.name AS [package_name],
obj.name AS [object_name],
obj.description AS [description]
FROM sys.dm_xe_objects AS obj
INNER JOIN sys.dm_xe_packages AS pkg ON pkg.guid = obj.package_guid
WHERE obj.object_type in ('action', 'event', 'target')
ORDER BY obj.object_type,
pkg.name,
obj.name;
创建扩展事件会话
你将在下面看到使用 SQL Server Management Studio 中的“新建会话”对话框创建扩展事件会话的基本过程。 可以通过在 SSMS 中展开“管理”节点,展开“扩展事件”节点,右键单击“会话”,然后选择“新建会话”来访问此屏幕。
上图显示了扩展事件功能的“新建会话”对话框。 必须首先命名会话。 SQL Server 提供了许多模板,它们分组为以下类别:
- 锁和块
- 探查器等效项
- 查询执行
- 系统监视
这些预定义模板可让你快速开始使用扩展事件进行监视。 在此示例中,你将看到手动添加到会话中的事件以演练所有选项,但是在你开始操作时,使用模板可以是创建基本会话的一种简单方式。
对于何时启动此会话,有几个复选框选项可供使用。 可以选择每当服务器启动时启动新会话,也可以选择在创建会话后立即启动会话。 通过 SQL Server Management Studio 中的“扩展事件”节点,管理员可以随时启动和停止扩展事件会话。 你还可以选择启用因果关系跟踪,这会向每个事件的输出添加全局唯一标识符 (GUID) 和序列号,使你可以轻松地逐步完成事件发生的顺序。
上图显示将事件添加到会话的屏幕。 事件表示数据库引擎代码中的兴趣点 — 这些可以仅仅表示内部系统操作,也可以与用户操作(如查询执行)相关联。 在上面的示例中,可以看到向此事件会话添加了事件 sp_statement_completed
、sql_batch_completed
和 sql_statement_completed
。 默认情况下,此会话会捕获这些事件在实例上发生的所有实例。 可以通过单击配置按钮来限制收集。
事件配置屏幕允许定义所收集的数据,因为它与事件相关。 全局字段使你可以选择在事件发生时所收集的数据。 全局字段也称为操作,因为操作用于将其他数据字段添加到事件。 这些字段表示在扩展事件发生时收集的数据,在大多数扩展事件中是通用的。 下图显示扩展事件的筛选器选项。
筛选器是扩展事件的一种强大功能,可让你使用精细控制仅捕获你要捕获的事件的特定发生。 在此示例中,可以看到筛选器应用于字段 sqlserver.is_system
,它在其中等于零,这表示查询不是内部操作。 换句话说,会话不会捕获由系统连接提交的语句的完成情况,我们只想捕获用户或用户应用程序提交的语句。
筛选器应用于单个事件上的单个字段。 若要确保不跟踪任何事件的系统活动,则需要针对每个事件单独进行筛选:事件 sql_statement_completed
、事件 sql_batch_completed
和事件 sp_statement_completed
。
为捕获的每个事件配置筛选器是一种很好的做法。 这可帮助提高数据收集的效率,并使你能够缩小搜索侧重范围。
下图显示所收集的事件字段。 这些字段特定于所触发的事件,可以包含可选字段以进行收集。 在上面的事件中,可以看到可选收集选项是 statement
和 parameterized_plan_handle
。
定义了事件会话后,会定义存储目标,如下图所示。
扩展事件会话具有目标 — 目标可以简单地被视为引擎跟踪事件发生的位置。 两个较常见的目标是事件文件,它是文件系统上可存储事件的文件,在 Azure SQL PaaS 产品/服务中,此数据将写入 Blob 存储。 另一个常见目标是 SQL Server 内存中的环形缓冲区。 环形缓冲区最常用于事件会话的实时观察,因为它是循环缓冲区,并且数据不会在会话之外保持。 大多数目标以异步方式处理数据,这意味着事件数据在保存到磁盘之前会写入内存。 例外情况是 Windows 事件跟踪 (ETW) 和事件计数器目标,它们以同步方式进行处理。
下表包含用于每种类型的扩展事件目标的信息。
Target | 描述 | Processing |
---|---|---|
事件计数器 | 计算在扩展事件会话过程中发生的所有事件的数目。 这用于获取有关工作负载的工作负载特征的信息,而不会产生完整事件收集的开销。 | 同步 |
事件文件 | 将事件会话输出从内存写入磁盘上的持久文件。 | 异步 |
事件配对 | 许多事件通常成对发生(例如,锁获取、锁释放),此收集可以用于标识这些事件未在匹配集中发生的时间。 | 异步 |
Windows 事件跟踪 (ETW) | 用于将 SQL Server 事件与 Windows OS 事件数据相关联。 | 同步 |
直方图 | 这类似于事件计数器,用于计算事件的发生次数。 不同之处在于,直方图可以基于特定事件列或操作进行计数。 | 异步 |
环形缓冲区 | 用于将数据保存在内存中。 数据不会在磁盘上持久保持,可能经常从缓冲区刷新 | 异步 |
或者,可以使用 T-SQL 创建扩展事件会话。 以下 T-SQL 命令提供了如何创建扩展事件会话的示例:
IF EXISTS (SELECT * FROM sys.server_event_sessions WHERE name='test_session')
DROP EVENT session test_session ON SERVER;
GO
CREATE EVENT SESSION test_session
ON SERVER
ADD EVENT sqlos.async_io_requested,
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.etw_classic_sync_target (SET default_etw_session_logfile_path = N'C:\demo\traces\sqletw.etl' )
WITH (MAX_MEMORY=4MB, MAX_EVENT_SIZE=4MB);
GO
事件会话的范围可以是服务器或数据库。 在上面所示的示例中,会添加两个事件,并使用 Windows 事件跟踪 (ETW) 路径和文件位置。 创建会话之后,必须启动它。 你可以通过 T-SQL 并使用 STATE
选项对会话执行 ALTER
操作来实现此目的,也可以使用 SQL Server Management Studio 来实现。