0. SQL Server監控清單

數據庫服務器的監控可大體分爲兩類:shell

(1) 狀態監控:數據庫服務器有沒有在健康地運行?數據庫

(2) 性能監控:健康運行的同時,有沒有性能問題?可不能夠更快些?性能優化

 

. 服務器服務器

1. 狀態監控網絡

(1) 服務器是否可訪問?工具

(2) 數據庫服務是否啓用?性能

(3) 操做系統事件日誌中的錯誤或告警測試

(4) 磁盤可用空間優化

 

2. 性能監控spa

(1) IO壓力

(2) 內存使用

(3) CPU使用

(4) 網絡帶寬佔用

這1,2,3,4是按照容易出現瓶頸的順序排列的,因爲磁盤的讀寫速度限制,一般IO是最容易出現瓶頸的地方,咱們所作的不少優化,也都是針對IO的,好比:索引優化,讀寫分離等等。

 

. 數據庫

1. 狀態監控

(1) 數據庫能否打開 (數據庫狀態)

(2) SQL Server/SQL Server Agent錯誤日誌中的錯誤或告警

(3) 數據庫/文件組可用空間

(4) SQL Agent 做業運行狀態

(5) 數據庫備份有沒有成功

(6) 數據庫還原測試的結果

(7) 數據庫一致性檢查的結果 (DBCC CHECKDB)

 

如下幾條狀態監控,一般須要和系統平均值/基線值比較纔有意義,不然沒有告警的標準。

(8) 鏈接數、請求數、事務數、線程數

(9) 數據庫/文件/表的大小

(10) 表使用、行數

 

2. 性能監控

(1) 有沒有長時間運行的查詢 (通常指沒有被任何請求阻塞,效率不好的查詢)

(2) 有沒有被阻塞的查詢 (可能單獨運行很快,但和別的請求一塊兒,因爲有鎖等待,耗時很長)

(3) 有沒有死鎖 (開發人員/用戶口中說的」死鎖」 一般是阻塞/等待,數據庫死鎖一般不多讓用戶感受到等待,通常是請求被中斷,由於被kill掉了)

(4) 有沒有等待 (通常指各類資源的等待,等待和阻塞的交集就是鎖等待)

 

如下幾條性能監控,一般在性能優化時做爲參考,或者如:索引碎片整理/統計信息更新,直接設置爲後臺維護做業,並不直接告警。

(5) 有沒有缺失的/未被使用的/效率不高的索引,以及索引碎片

(6) 有沒有過時的統計信息

(7) 有沒有數據庫文件的爭用 (好比:日誌文件,tempdb爭用)

(8) 有沒有消耗CPU較大、IO讀寫較多的查詢 (一般IO消耗大的,也就是內存消耗大的查詢)

 

. 其餘

(1). 若是有部署高可用的策略,會有鏡像、複製、日誌傳送、集羣狀態的監控;

(2). 某些業務數據有嚴格的一致性要求,業務數據的校驗,最好也作在監控的告警裏面;

(3). 對於數據庫/實例的選項、參數設置,連接服務器等對象的可用性,一般在每一年/每季度的health check裏檢查過就能夠了,若是不放心,固然也能夠放到監控的告警中來。

 

. 如何部署監控?

1. 不要選擇依賴性的腳本/命令

以監視服務是否啓動爲例,腳本以下:

(1) SQL擴展存儲過程

--參數1: QueryState 檢查服務狀態/ Start啓動服務/ Stop停掉服務
--參數2: 服務名
exec master.dbo.xp_servicecontrol 'QueryState', 'MSSQLServer'
exec master.dbo.xp_servicecontrol 'QueryState', 'SQLServerAgent'
exec master.dbo.xp_servicecontrol 'QueryState', 'SQLBrowser'
exec master.dbo.xp_servicecontrol 'QueryState', 'NetLogon'

EXEC xp_servicecontrol N'Stop', N'SQLServerAGENT'
EXEC xp_servicecontrol N'Start',N'SQLServerAGENT'

 

 (2) SQL調用操做系統命令

if OBJECT_ID('tempdb..#tmp_started_services') is not null
    drop table #tmp_started_services
create table #tmp_started_services (started_services varchar(255))

insert into #tmp_started_services(started_services)   
exec master..xp_cmdshell 'net start' 

select * 
  from #tmp_started_services 
 where LTRIM(RTRIM(started_services)) like 'SQL%'

若是SQL Server沒啓動,這些腳本根本就跑不了,又怎麼監控呢?

也許,又會有這麼一個思路,服務器正常時,發出郵件通知,若是沒有收到郵件就說明服務器不正常了,可若是有不少服務器時,怎麼知道誰沒發郵件呢?

 

2. 部署在專門的一臺/多臺監控機上

服務器狀態監控,無論使用第三方工具,仍是使用自定義腳本,都建議部署在專門的監控機上,遠程監視目標機器。

由於:若是服務器DOWN了或者故障了,可能本機的程序/腳本就沒法運行了,又怎麼監控呢?

 

最後

基於上面的監控列表,還須要將監測工做自動化,並在發現問題時告警。

相關文章
相關標籤/搜索