SQL Server Agent 警報不觸發、運算子不收到通知是常見運維痛點。本文提供 7 步標準排查流程,覆蓋補丁、服務賬號、服務狀態、啟用狀態、性能計數器、錯誤日志、通知通道。
7 步標準排查清單
- 確認 Service Pack 版本:安裝最新 SP 修復已知警報 Bug (
SELECT @@VERSION / SERVERPROPERTY('ProductLevel'))
- 檢查 SQL Server Agent 服務賬號:必須為域用戶 (非 LocalSystem),才能訪問網絡資源、寫入遠程事件日志、發送郵件/傳呼 (
services.msc → 登錄頁籤)
- 驗證核心服務運行狀態:
SQLServerAgent + EventLog 服務均需 Running 狀態
- 確認警報啟用狀態:Enterprise Manager → 管理 → SQL Server Agent → 警報 → 雙擊目標警報 → 勾選「啟用」
- 檢查警報歷史記錄:同界面查看「歷史記錄」頁籤,確認上次觸發時間、是否有報錯
- 核對性能計數器採樣間隔:Agent 每 20 秒 採樣一次性能計數器。若警報條件持續時間 < 20 秒,可能漏採樣導致不觸發
- 三大日志聯動分析:
- SQL Server 錯誤日志 (
ERRORLOG)
- SQL Server Agent 錯誤日志 (
SQLAGENT.OUT)
- Windows 應用程序事件日志
對比警報失效時間點前後的錯誤記錄,定位根因
運算子通知不送達專項排查
- 手動測試通知通道:
EXEC msdb.dbo.sp_notify_operator @name='DBA', @subject='Test', @body='Test'
- 或 SQL Agent → 運算子 → 右鍵 → 發送測試郵件/傳呼/網絡發送
- 檢查運算子配置:郵件地址/傳呼號碼/Net Send 名稱是否正確、啟用狀態
- 檢查 Database Mail / SQLMail 配置:
EXEC msdb.dbo.sysmail_help_status_sp、郵件隊列 sysmail_mailitems
- 網絡防火牆/反垃圾郵件網關是否攔截
現代化替代:Always On 可用性組監控 + Azure Monitor / Prometheus
- 傳統警報基於性能計數器/錯誤號,延遲高、誤報多
- 推薦遷移至:Extended Events 捕獲精確事件 + Prometheus + Alertmanager 多維指標告警 + Grafana 可視化
- 關鍵指標:
sqlserver_database_replica_state、sqlserver_log_send_queue_size、sqlserver_redo_queue_size、sqlserver_failed_login_attempts