SQL Server自動化運維系列:監控性能指標腳本

jopen 9年前發布 | 12K 次閱讀 SQL Server 數據庫服務器

需求描述

一般在生產環境中,有時候需要自動的檢測指標值狀態,如果發生異常,需要提前預警的,比如發郵件告知,本篇就介紹如果通過Power shell實現狀態值監控。

監控值范圍

根據經驗,作為DBA一般需要監控如下系統能行指標。

cpu:

                \Processor(_Total)\% Processor Time                 \Processor(_Total)\% Privileged Time

                \SQLServer:SQL Statistics\Batch Requests/sec                 \SQLServer:SQL Statistics\SQL Compilations/sec                 \SQLServer:SQL Statistics\SQL Re-Compilations/sec                 \System\Processor Queue Length                 \System\Context Switches/sec

        Memory:

                \Memory\Available Bytes                 \Memory\Pages/sec                 \Memory\Page Faults/sec                 \Memory\Pages Input/sec                 \Memory\Pages Output/sec                 \Process(sqlservr)\Private Bytes                 \SQLServer:Buffer Manager\Buffer cache hit ratio                 \SQLServer:Buffer Manager\Page life expectancy                 \SQLServer:Buffer Manager\Lazy writes/sec                 \SQLServer:Memory Manager\Memory Grants Pending                 \SQLServer:Memory Manager\Target Server Memory (KB)                 \SQLServer:Memory Manager\Total Server Memory (KB)

        Disk:

                \PhysicalDisk(_Total)\% Disk Time                 \PhysicalDisk(_Total)\Current Disk Queue Length                 \PhysicalDisk(_Total)\Avg. Disk Queue Length                 \PhysicalDisk(_Total)\Disk Transfers/sec                 \PhysicalDisk(_Total)\Disk Bytes/sec                 \PhysicalDisk(_Total)\Avg. Disk sec/Read                 \PhysicalDisk(_Total)\Avg. Disk sec/Write

        SQL Server:

                \SQLServer:Access Methods\FreeSpace Scans/sec                 \SQLServer:Access Methods\Full Scans/sec                 \SQLServer:Access Methods\Table Lock Escalations/sec                 \SQLServer:Access Methods\Worktables Created/sec                 \SQLServer:General Statistics\Processes blocked                 \SQLServer:General Statistics\User Connections                 \SQLServer:Latches\Total Latch Wait Time (ms)                 \SQLServer:Locks(_Total)\Lock Timeouts (timeout &gt; 0)/sec                 \SQLServer:Locks(_Total)\Lock Wait Time (ms)                 \SQLServer:Locks(_Total)\Number of Deadlocks/sec                 \SQLServer:SQL Statistics\Batch Requests/sec                 \SQLServer:SQL Statistics\SQL Re-Compilations/sec</pre>

上述指標含義,可以參照我上一篇文章:SQL Server需要監控哪些計數器

監控腳本

$server = "(local)"
$uid = "sa"
$db="master"
$pwd="password"
$mailprfname = "SendEmail"
$recipients = "787449667@qq.com"
$subject = "數據庫指標異常了!"
$computernamexml = "f:\computername.xml"
$alter_cpuxml = "f:\alter_cpu.xml"
function GetServerName($xmlpath)
{
    $xml = [xml] (Get-Content $xmlpath)
    $return = New-Object Collections.Generic.List[string]
    for($i = 0;$i -lt $xml.computernames.ChildNodes.Count;$i++)
    {
        if ( $xml.computernames.ChildNodes.Count -eq 1)
        {
            $cp = [string]$xml.computernames.computername
        }
        else
        {
            $cp = [string]$xml.computernames.computername[$i]
        }
        $return.Add($cp.Trim())
    }
    $return
}

function GetAlterCounter($xmlpath) { $xml = [xml] (Get-Content $xmlpath) $return = New-Object Collections.Generic.List[string] $list = $xml.counters.Counter $list }

function CreateAlter($message) { $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $CnnString ="Server = $server; Database = $db;User Id = $uid; Password = $pwd" $SqlConnection.ConnectionString = $CnnString $CC = $SqlConnection.CreateCommand(); if (-not ($SqlConnection.State -like "Open")) { $SqlConnection.Open() }

$cc.CommandText=" EXEC msdb..sp_send_dbmail 
         @profile_name  = '$mailprfname'
        ,@recipients = '$recipients'
        ,@body = '$message'
        ,@subject = '$subject'

" $cc.ExecuteNonQuery()|out-null $SqlConnection.Close(); }

$names = GetServerName($computernamexml) $pfcounters = GetAlterCounter($alter_cpuxml) foreach($cp in $names) { $p = New-Object Collections.Generic.List[string] $report = "" foreach ($pfc in $pfcounters) { $b = "" $counter ="\"+$cp+$pfc.get_InnerText().Trim() $p.Add($counter)

}
$count = Get-Counter $p
for ($i = 0; $i -lt $count.CounterSamples.Count; $i++)
{
    $v = $count.CounterSamples.Get($i).CookedValue
    $pfc = $pfcounters[$i]
    #$pfc.get_InnerText()
    $b = ""
    $lg = ""
    if($pfc.operator -eq "lt")
    {
        if ($v -ge [double]$pfc.alter)
            {$b = "alter"
            $lg = "Greater Than"}
    }
    elseif ($pfc.operator -eq "gt")
    {
        if( $v -le [double]$pfc.alter)
            {$b = "alter"
            $lg = "Less Than"}
    }
    if($b -eq "alter")
    {
        $path = "\\"+$cp+$pfc.get_InnerText()

        $item = "{0}:{1};{2} Threshold:{3}" -f $path,$v.ToString(),$lg,$pfc.alter.Trim()
        $report += $item + "`n"
    }

}
if($report -ne "")
{
    #生產警告 參數 計數器,閥值,當前值
    CreateAlter $report
}

}</pre>

其中涉及到2個配置文件:computernamexml,alter_cpuxml分別如下:

<computernames>
        <computername>
                wuxuelei-pc
        </computername>
</computernames>
<Counters>
        <Counter alter = "10" operator = "gt" >\Processor(_Total)\% Processor Time</Counter>
        <Counter alter = "10" operator = "gt" >\Processor(_Total)\% Privileged Time</Counter>
        <Counter alter = "10" operator = "gt" >\SQLServer:SQL Statistics\Batch Requests/sec</Counter>
        <Counter alter = "10" operator = "gt" >\SQLServer:SQL Statistics\SQL Compilations/sec</Counter>
        <Counter alter = "10" operator = "gt" >\SQLServer:SQL Statistics\SQL Re-Compilations/sec</Counter>
        <Counter alter = "10" operator=  "lt" >\System\Processor Queue Length</Counter>
        <Counter alter = "10" operator=  "lt" >\System\Context Switches/sec</Counter>
</Counters>

其中 alter 就是閥值,如第一條,如果 閥值 > 性能計數器值,就會發出警告。

其實這種自定義配置的方式,實現了靈活多變的自動化監控標準:

1、比如可以檢測磁盤空間大小

2、檢測運行峰值狀態

3、定時的根據歷史運行值,更改生產系統中的閥值大小,也就是所謂的運行基線

警告實現方式

1、SQL Agent配置Job方式實現

2、計劃任務

以上兩種配置方式,可以靈活掌握,操作還是蠻簡單的,如果不會,可自行google。當然,如果不想干預正常的生產系統,可以添加一個Server專門用來自動化運維檢測來用,實現遠程監控。

后續文章中會分析關于Power Shell的遠程調用,并且能實現事故當前狀態下,自動化截圖….自動Send Email……為DBA現場取證第一手材料…方便診斷問題…

效果圖如下

SQL Server自動化運維系列:監控性能指標腳本

以上只提供實現方式,如需要內容更新,自己靈活更新。

腳本下載地址http://files.cnblogs.com/zhijianliutang/DBALter.zip

來源: 指尖流淌

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!