使用 system_health 会话

适用于:SQL ServerAzure SQL 托管实例

system_health 会话是 SQL Server 和 Azure SQL 托管实例默认包含的扩展事件会话。 该会话在数据库引擎启动时自动启动,并且运行时不会带来任何明显的性能开销。 该会话收集的系统数据可用于帮助对数据库引擎的性能问题进行故障排除。

重要

建议不要停止、更改或删除 system_health 会话。 将来的产品更新可能会覆盖对 system_health 会话设置所做的任何更改。

该会话收集的信息包括:

  • 发生严重性 > =20 的错误的任何会话的 sql_textsession_id
  • 发生内存相关错误的任何会话的 sql_textsession_id。 这些错误包括 17803、701、802、8645、8651、8657 和 8902。
  • 任何无法完成的计划程序问题的记录。 这些问题在 SQL Server 错误日志中显示为错误 17883。
  • 检测到的任何死锁,包括死锁图形。
  • 等待闩锁(或其他相关资源)时间 > 15 秒的任何会话的 callstacksql_textsession_id
  • 等待锁(或其他相关资源)时间 > 30 秒的任何会话的 callstacksql_textsession_id
  • 为获得“抢先等待”(或其他相关资源)而等待时间很长的任何会话的 callstacksql_textsession_id。 持续时间因等待类型而异。 在抢先等待中,SQL Server 等待的是外部 API 调用。
  • CLR 分配失败和虚拟分配失败的 callstacksession_id
  • 有关内存代理、计划程序监视、内存节点 OOM、安全性和连接的环形缓冲区事件。
  • 来自 sp_server_diagnostics 的系统组件结果。
  • scheduler_monitor_system_health_ring_buffer_recorded 收集的实例运行状况。
  • CLR 分配失败。
  • 使用 connectivity_ring_buffer_recorded 的连接性错误。
  • 使用 security_error_ring_buffer_recorded 的安全错误。

注意

有关死锁的详细信息,请参阅《死锁指南》。 有关 SQL 错误消息的详细信息,请参阅数据库引擎事件和错误

查看 system_health 会话数据

会话同时使用环形缓冲区目标和事件文件目标存储数据。 事件文件目标配置为最大大小为 5 MB,文件保留策略为 4 个文件。

若要使用 SQL Server Management Studio 中提供的扩展事件用户界面查看环形缓冲区目标中的会话数据,请参阅《SQL Server 中扩展事件的目标数据的高级查看功能 - 查看实时数据》

若要使用 Transact-SQL 查看环形缓冲区中的会话数据,请使用以下查询:

SELECT CAST(xet.target_data as xml) AS target_data
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'

若要查看事件文件中的会话数据,请使用 SQL Server Management Studio 中提供的扩展事件事件查看器 UI。 有关详细信息,请参阅在 SQL Server Management Studio 中查看事件数据

还原 system_health 会话

如果删除 system_health 会话,可以通过执行 u_tables.sql 脚本来还原会话。 该文件位于下面的文件夹中,其中 C: 表示安装 SQL Server 程序文件的驱动器,MSSQLnn表示 SQL Server 的主要版本:

C:\Program Files\Microsoft SQL Server\MSSQLnn.\<instanceid>\MSSQL\Install

在还原该会话后,必须使用 ALTER EVENT SESSION 语句或使用对象资源管理器中的“扩展事件”节点启动会话。 否则,该会话会在你下次重新启动 SQL Server 服务时自动启动。

Azure SQL 中的 system_health 会话

在 Azure SQL 托管实例中,可在对象资源管理器中右键单击 event_filering_buffer 目标然后选择“查看目标数据”来查看 system_health 会话数据。

Azure SQL 数据库中没有内置的 system_health 扩展事件会话,但你可以使用 sys.fn_xe_file_target_read_file() 函数来读取你自己创建并储存在 Azure 存储中的扩展事件。 有关演练,请参阅《Azure SQL 数据库中扩展事件的事件文件目标代码》