system_health会话概念
我们知道扩展事件(Extended Events)是从SQL Server 2008开始引入的。system_health会话是SQL Server默认包含的扩展事件会话。该会话在SQL Server数据库引擎启动时自动启动,并且运行时不会对性能造成任何明显影响。该会话收集的系统数据可用于帮助对数据库引擎的性能问题进行故障排除。
该会话收集的信息包括:(下面来自官方文档“使用 system_health 会话”)
· 发生严重性 >=20 的错误的任何会话的 sql_text 和 session_id 。
·
· 发生内存相关错误的任何会话的 sql_text 和 session_id。 这些错误包括 17803、701、802、8645、8651、8657 和 8902。
·
· 任何无法完成的计划程序问题的记录。 这些问题在 SQL Server 错误日志中显示为错误 17883。
·
· 检测到的任何死锁,包括死锁图形。
·
· 等待闩锁(或其他相关资源)时间 > 15 秒的任何会话的 callstack、sql_text 和 session_id。
·
· 等待锁(或其他相关资源)时间 > 30 秒的任何会话的 callstack、sql_text 和 session_id。
·
· 为获得“抢先等待”(或其他相关资源)而等待时间很长的任何会话的 callstack、sql_text 和 session_id。 持续时间因等待类型而异。 在抢先等待中, SQL Server 等待的是外部 API 调用。
·
· CLR 分配失败和虚拟分配失败的调用堆栈和 session_id。
·
· 有关内存代理、计划程序监视、内存节点 OOM、安全性和连接的环形缓冲区事件。
·
· 来自 sp_server_diagnostics 的系统组件结果。
·
· scheduler_monitor_system_health_ring_buffer_recorded 收集的实例运行状况。
·
· CLR 分配失败。
·
· 使用 connectivity_ring_buffer_recorded 时的连接错误。
·
· 使用 security_error_ring_buffer_recorded 时的安全错误。
其实我们用system_health会话最多的地方,就是查看、分析死锁信息。这也是为什么这篇文章要总结的原因。因为死锁是DBA经常遇到的问题之一,而system_health会话是捕获、分析死锁最佳工具,没有之一。
system_health会话配置
如果要确认system_health会话是否在启动时是否启动会话,可以使用下面脚本:
startup_state:0 (OFF)。 服务器启动时不启动会话。
1 (ON)。 服务器启动时启动事件会话。
SELECT
es.name,
esf.name,
esf.value,
es.startup_state
FROM
sys.server_event_session_fields AS esf
JOIN
sys.server_event_sessions AS es
ON
esf.event_session_id=es.event_session_id
WHERE es.name='system_health'