system_health会话是 SQL Server 默认包含的扩展事件会话。 当 SQL Server 数据库引擎启动时,此会话会自动启动,并且无需任何明显的性能影响即可运行。 会话收集可用于帮助排查数据库引擎中的性能问题的系统数据。 因此,建议不要停止或删除会话。
会话收集的信息包括以下内容:
- 在任何会话中,如果遇到严重性大于或等于20的错误,则记录该会话的sql_text和session_id。 
- 任何会话遇到内存相关错误时的sql_text和session_id。 这些错误包括 17803、701、802、8645、8651、8657 和 8902。 
- 任何没有响应的调度程序问题记录。 (这些错误显示在 SQL Server 错误日志中,显示为错误 17883。 
- 检测到的任何死锁。 
- 对于任何在闩锁(或其他有趣的资源)上等待了> 15秒的会话,请提供调用堆栈、sql_text和session_id。 
- 任何在锁上等待> 30秒的会话的调用堆栈、sql_text和session_id。 
- 任何长时间等待抢占式等待的会话的调用堆栈、sql_text和session_id。 持续时间因等待类型而异。 预先等待是指 SQL Server 在等待外部 API 调用时的状态。 
- CLR 分配和虚拟分配失败的调用堆栈和session_id。 
- ring_buffer事件用于内存代理、计划程序监视器、内存节点内存不足(OOM)、安全性和连接。 
- 来自sp_server_diagnostics的系统组件结果。 
- scheduler_monitor_system_health_ring_buffer_recorded收集的系统实例运行状况。 
- CLR 分配失败。 
- 使用connectivity_ring_buffer_recorded出现的连接错误。 
- 由security_error_ring_buffer_recorded引发的安全错误。 
查看会话数据
会话使用环形缓冲区目标来存储数据。 若要查看会话数据,请使用以下查询:
SELECT CAST(xet.target_data as xml) FROM sys.dm_xe_session_targets xet  
JOIN sys.dm_xe_sessions xe  
ON (xe.address = xet.event_session_address)  
WHERE xe.name = 'system_health'  
若要查看事件文件中的会话数据,请使用 Management Studio 中提供的扩展事件用户界面。 有关详细信息,请参阅 “查看事件会话数据 ”。
还原system_health会话
如果删除system_health会话,可以通过在查询编辑器中执行 u_tables.sql 文件来还原它。 此文件位于以下文件夹中,其中 C: 表示安装了 SQL Server 程序文件的驱动器:
C:\Program Files\Microsoft SQL Server\MSSQL12.<instanceid>\MSSQL\Install
请注意,还原会话后,必须使用 ALTER EVENT SESSION 语句或使用对象资源管理器中的 扩展事件 节点来启动会话。 否则,会话将在下次重新启动 SQL Server 服务时自动启动。