system_health會話概念 我們知道擴展事件(Extended Events)是從SQL Server 2008開始引入的。system_health會話是SQL Server預設包含的擴展事件會話。該會話在SQL Server資料庫引擎啟動時自動啟動,並且運行時不會對性能造成任何明顯影響。... ...
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'
在SQL Server 2008下碰到一個很奇怪的事情(只是一個特例,不是所有SQL Server 2008都有這種現象),system_health會話的create_time居然大於當前的getdate(). 似乎是個bug來著。