SQL Server扩展事件(Extended Events)—使用system_health扩展事件会话
system_health 会话是 SQL Server 默认包含的扩展事件会话。 该会话在 SQL Server 数据库引擎启动时自动启动,并且运行时不会对性能造成任何明显影响。 该会话收集的系统数据可用于帮助对数据库引擎的性能问题进行故障排除。 因此,我们建议您不要停止或删除该会话。
此会话源自产品支持团队的想法,它可以跟踪通常被用来对客户系统进行调试的信息(例如当客户系统发生死锁或出现其它严重错误时)。此会话的创建和启动是 SQL Server实例安装过程的一部分,它在环缓冲区中跟踪事件,因此不会消耗太多内存。
该会话收集的信息包括:
l 发生严重性 >=20 的错误的任何会话的 sql_text 和 session_id。
l 发生与内存有关的错误的任何会话的 sql_text 和 session_id。 这些错误包括 17803、701、802、8645、8651、8657 和 8902。
l 任何无法完成的计划程序问题的记录。 (这些问题在 SQL Server 错误日志中显示为错误 17883。)
l 检测到的任何死锁。
l 等待闩锁(或其他相关资源)的时间 > 15 秒的任何会话的 callstack、sql_text 和 session_id 。
l 等待锁的时间 > 30 秒的任何会话的 callstack、sql_text 和 session_id 。
l 已长时间等待以获得抢先等待的任何会话的 callstack、sql_text 和 session_id。 持续时间因等待类型而异。 在抢先等待中,SQL Server 等待的是外部 API 调用。
l CLR 分配失败和虚拟分配失败的调用堆栈和 session_id。
l 有关内存 Broker、计划程序监视、内存节点 OOM、安全性和连接的 ring_buffer 事件。
l sp_server_diagnostics 中的系统组件结果。
l scheduler_monitor_system_health_ring_buffer_recorded 收集的实例运行状况。
l CLR 分配失败。
l 使用 connectivity_ring_buffer_recorded 时的连接错误。
l 使用 security_error_ring_buffer_recorded 时的安全错误。
查看会话定义
下面显示默认事件会话system_health的定义:
SELECT name, event_retention_mode_desc AS event_retention_mode, max_dispatch_latency, max_memory, max_event_size, memory_partition_mode_desc AS memory_partition_mode, track_causality, startup_state FROM sys.server_event_sessions WHERE name = ‘system_health‘;
下面显示事件、谓词和动作:
SELECT package, e.name, predicate, ( SELECT package + ‘.‘ + name + ‘, ‘ FROM sys.server_event_session_actions a WHERE a.event_session_id = e.event_session_id AND a.event_id = e.event_id ORDER BY package, name FOR XML PATH(‘‘) ) AS Actions FROM sys.server_event_session_events e INNER JOIN sys.server_event_sessions es ON e.event_session_id = es.event_session_id WHERE es.name = ‘system_health‘;
下面显示目标及其选项:
SELECT package, t.name, ( SELECT name + ‘=‘ + cast(value AS varchar) + ‘, ‘ FROM sys.server_event_session_fields f WHERE f.event_session_id = t.event_session_id AND f.object_id = t.target_id FOR XML PATH(‘‘) ) AS options FROM sys.server_event_session_targets t INNER JOIN sys.server_event_sessions es ON t.event_session_id = es.event_session_id WHERE es.name = ‘system_health‘;
查看会话数据
当事件会话创建并运行,数据收集在目标用于后续使用。除了文件目标(event_file),从sys.dm_xe_session_targets视图中可以查询到所有的目标数据,需要读取数据通过sys.fn_xe_file_target_read_file()表值函数。从sys.dm_xe_session_targets转换target_data列为XML格式。
您可以使用下列代码来查看环缓冲区中包含的内容:
SELECT name, target_name, CAST(target_data AS XML) target_data FROM sys.dm_xe_sessions s INNER JOIN sys.dm_xe_session_targets t ON s.address = t.event_session_address WHERE s.name = ‘system_health‘; GO
若要查看事件文件中的会话数据,请使用 Management Studio 中提供的扩展事件用户界面。
还原system_health会话
如果删除 system_health 会话,则可以通过在查询编辑器中执行 u_tables.sql 文件来还原该会话。 该文件位于下面的文件夹中,其中 C: 表示您安装 SQL Server 程序文件的驱动器:
C:\Program Files\Microsoft SQL Server\MSSQL11.<instanceid>\MSSQL\Install
请注意在还原该会话后,必须使用 ALTER EVENT SESSION 语句或使用对象资源管理器中的“扩展事件”节点启动会话。 否则,该会话会在您下次重新启动 SQL Server 服务时自动启动。