亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server自動化運維系列——監控磁盤剩余空間及SQL Server錯誤日志(Power Shell)

2024-08-31 00:54:41
字體:
來源:轉載
供稿:網友
SQL Server自動化運維系列——監控磁盤剩余空間及SQL Server錯誤日志(Power Shell)

需求描述

在我們的生產環境中,大部分情況下需要有自己的運維體制,包括自己健康狀態的檢測等。如果發生異常,需要提前預警的,通知形式一般為發郵件告知。

在所有的自檢流程中最基礎的一個就是磁盤剩余空間檢測。作為一個高效的DBA不可能每天都要上生產機上查看磁盤剩余或者直到磁盤無剩余空間報錯后才采取擴容措施。

當然,作為微軟的服務器有著自己的監控軟件:SCCM(System Center Configuration Manager)。但本篇就介紹如果通過Power shell實現狀態值監控,相比SCCM更輕量級和更具靈活性。

本篇實現

1、每天檢測磁盤剩余空間大小,如果剩余空間超過了閥值,則發郵件告訴管理員

2、每天檢測SQL Server運行的錯誤日志(Window平臺的錯誤日志),形成郵件附件發送給管理員

監控腳本

首先我們來解決第一個問題,關于磁盤剩余空間的問題,對于磁盤的監控的存在兩個需要解決的問題:

<1>一般監控我們需要監控很多臺服務器的磁盤,所以對于服務器的量控制我們需要生成一個配置文件。

<computernames>        <computername>                wuxuelei-pc        </computername></computernames>

配置文件名字:computername.xml,這樣就解決很多服務器的問題,只需要在配置文件中增加就可以,因為我在本地測試,所以就配置了我的本地電腦

<2>對于服務器的磁盤監控也需要定義一個閥值,用來動態改變,用來定義生成預警的閥值。簡單點就是定義我們檢測的磁盤剩余空間到了多少了就自動發郵件提醒。

<Counters>        <Counter alter = "10" Operator = "gt" >C:</Counter>        <Counter alter = "10" operator = "gt" >D:</Counter>        <Counter alter = "10" operator = "gt" >E:</Counter>        <Counter alter = "10" operator = "gt" >F:</Counter></Counters>

文件名為:alter_disk.xml,我定義了四個盤符:C: D: E: F:

當以上四個盤符那個盤符少于10G了就生成郵件預警。

實現代碼如下:

$server = "(local)"$uid = "sa"$db="master"$pwd="passWord"$mailPRfname = "TestMail"$recipients = "787449667@QQ.com"$subject = "老大,快去看看這個服務器的磁盤空間馬上就不夠了!"$computernamexml = "F:/PowerShell/發送郵件/computername.xml"$alter_xml = "F:/PowerShell/發送郵件/alter_disk.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_xml)foreach($cp in $names){    $p = New-Object Collections.Generic.List[string]    $report = ""    foreach ($pfc in $pfcounters)    {        $b = ""        $counter ="http://"+$cp+"/LogicalDisk("+$pfc.get_InnerText().Trim()+")/% Free Space"        $p.Add($counter)            }        $count = Get-Counter $p    #Write-Host $count.CounterSamples.Count;    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 "gt")        {            if( $v -le [double]$pfc.alter)                {                    $b = "alter"                    $lg = "Less Than"                }                if($b -eq "alter")                {                    $path = "機器名:"+$cp+"; 盤符:"+$pfc.get_InnerText()                    $diskFree="; 當前剩余空間為:"+[math]::truncate($v).ToString()+"G;"                    $aler=" 超過了你預定的閥值:"+$pfc.alter.Trim()+"G;速度去處理吧!"                                $item = "{0} {1} {2}" -f $path,$diskFree,$aler                    $report += $item + "`n"                }        }               }    if($report -ne "")    {        #生產警告 參數 計數器,閥值,當前值        CreateAlter $report    }}

通過如上腳本,生成跑批任務,就可以自動的檢測磁盤剩余空間了,而不需要我們去手動檢測了。

上述代碼中,有兩個技術點:1、需要自己配置SQL Server郵件代理;2、需要自己配置跑批計劃,方法自己網上搜,很簡單。

效果圖如下

嘿...看到上面的郵件,就是需要聯系硬件架構師,讓其擴容或者清除冗余數據的時候了。

在上面的腳本中,的確只有我的F盤符超了閥值,所以警報了!

其次,我們來解決第二個問題,關于SQL Server錯誤日志的問題,作為日常的DBA管理系統中,查看SQL Server錯誤日志是一種常用的方式。當然,如果系統運行正常,不會產生錯誤日志,一單出現問題,就會生成錯誤日志,但是對于SQL Server錯誤日志會產生很多條,為了方便查找,我們會讓其生成一個文本文件。

以郵件附件的形式,告知管理員,然后管理員就可以通過日志文件快速的定位問題的源頭。

同樣,本篇也是通過computername.xml文件,對多臺服務器進行錯誤日志進行篩選

腳本很簡單,如下

$server = "(local)"$uid = "sa"$db="master"$pwd="password"$mailprfname = "TestMail"$recipients = "787449667@qq.com"$subject = "老大,快去看看這個服務器的SQL Server出問題了!"$Info="附件為SQL Server錯誤日志....."$computernamexml = "F:/PowerShell/發送郵件/computername.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 = '$Info'            ,@subject = '$subject'            ,@file_attachments='$message'            "    $cc.ExecuteNonQuery()|out-null     $SqlConnection.Close();}$names = GetServerName($computernamexml)foreach($cp in $names){        #輸出系統日志中某個特定程序的日志到文件,比如SQL Server,然后選擇錯誤類型為Error        Get-EventLog -ComputerName  $cp application | where-object{$_.source-like "MSSQLSERVER"} | where-object{$_.entryType -eq "error"} >F:/PowerShell/$cp+"SQLErrLog.txt"                  #生產警告 參數 計數器,閥值,當前值        CreateAlter F:/PowerShell/$cp+"SQLErrLog.txt"}

效果圖如下

直接下載附件,然后查看錯誤日志就可以了。

該錯誤日志還是挺詳細的,發生時間,錯誤明細等

當然,上述腳本還欠缺一點邏輯:

比如:篩選一段時間周期的錯誤日志、或者只查看上次啟動之后的錯誤日志等。

這些邏輯加上也不麻煩,本身PowerShell實現起來就很簡單。這里就不展開了,自己靈活實現。

但是,在我們日常的分析中,在日志記錄多的時候,用文本分析的方式還是比較慢,通常用Excel查看效果會好很多。

這個實現也不麻煩,只需要更改腳本如下:

        #輸出系統日志中某個特定程序的日志到文件,比如SQL Server,然后選擇錯誤類型為Error        #Get-EventLog -ComputerName  $cp application | where-object{$_.source-like "MSSQLSERVER"} | where-object{$_.entryType -eq "error"} >F:/PowerShell/$cp+"SQLErrLog.txt"        #輸出系統日志中某個特定程序的日志到文件,比如SQL Server,然后選擇錯誤類型為Error,支持Excel打開        Get-EventLog -ComputerName  $cp application | where-object{$_.source-like "MSSQLSERVER"} | where-object{$_.entryType -eq "error"} | Export-Clixml –Path F:/PowerShell/$cp+"SQLErrLog.xml" –Depth 2                   #生產警告 參數 計數器,閥值,當前值        CreateAlter F:/PowerShell/$cp+"SQLErrLog.xml"

我們下載生成的日志文件,然后打開Excel,然后選擇:數據——>從Xml文件導入:

如此分析就方便多了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区深夜福利| 91精品国产亚洲| 中文字幕亚洲第一| 亚洲精品中文字幕av| 国产午夜精品理论片a级探花| 日韩激情片免费| 奇米成人av国产一区二区三区| 在线观看国产精品淫| 久久精品欧美视频| 色妞色视频一区二区三区四区| 综合国产在线观看| 亚洲伊人久久大香线蕉av| 国产精品劲爆视频| 亚洲自拍偷拍在线| 在线看国产精品| 欧美日韩色婷婷| 日韩高清免费在线| 国产精品毛片a∨一区二区三区|国| 亚洲最新中文字幕| 91高潮精品免费porn| 国产精品久久久久9999| 国产午夜精品全部视频在线播放| 日韩av免费在线| 亚洲欧美中文字幕在线一区| 久久精品国产一区二区三区| 日本成人免费在线| 精品久久久久久久久久久久| 中文综合在线观看| 久久久精品久久久| 欧美国产日韩中文字幕在线| 国产91精品黑色丝袜高跟鞋| 国产亚洲综合久久| 亚洲欧美在线第一页| 亚洲欧美成人精品| 97精品国产97久久久久久春色| 久久精品福利视频| 精品国产电影一区| 国产精品扒开腿做爽爽爽男男| 国模精品一区二区三区色天香| 欧美成人免费在线视频| 欧美国产在线视频| 国产成人一区二区在线| 在线观看国产欧美| 91精品视频一区| 欧美精品久久久久a| 欧美视频在线观看免费网址| 久久在线视频在线| 欧美劲爆第一页| 国模精品系列视频| 国产精品一区电影| 色综合亚洲精品激情狠狠| 久久婷婷国产麻豆91天堂| 91人成网站www| www.日韩欧美| 国产精品6699| 国产美女被下药99| 日韩高清欧美高清| 成人福利在线观看| 国产精品一区二区三区久久久| 欧美日韩性视频| 日韩精品极品视频免费观看| 欧美日韩人人澡狠狠躁视频| 欧美大肥婆大肥bbbbb| 欧美性精品220| 自拍偷拍亚洲欧美| 亚洲男女自偷自拍图片另类| 福利视频一区二区| 久久综合五月天| 欧美有码在线观看| 久久综合色88| 欧美成人免费一级人片100| 国产免费久久av| 日韩精品中文字幕在线| 国产精品成人一区二区| 77777少妇光屁股久久一区| 亚洲国产精品va在看黑人| 欧美大尺度激情区在线播放| 91成人在线视频| 亚洲国产精品成人av| 国产97色在线|日韩| 亚洲一二在线观看| 中文字幕一区二区三区电影| 亚洲第一视频在线观看| 久久夜色撩人精品| 97婷婷涩涩精品一区| 国产福利视频一区| 亚洲经典中文字幕| 色综合导航网站| 51久久精品夜色国产麻豆| 欧美久久精品午夜青青大伊人| 国产裸体写真av一区二区| 国产成人久久久| 亚洲第一福利视频| 欧美亚洲国产日韩2020| 日本精品久久电影| 8x海外华人永久免费日韩内陆视频| 久久夜精品va视频免费观看| 97视频人免费观看| 国产精品一久久香蕉国产线看观看| 中文字幕亚洲无线码a| 欧美xxxx做受欧美| 亚洲视频一区二区| 午夜精品一区二区三区视频免费看| 亚洲97在线观看| 色噜噜国产精品视频一区二区| 欧美在线观看日本一区| 成人欧美在线观看| 成人国产精品久久久| 久久露脸国产精品| 国产亚洲在线播放| 亚洲男女性事视频| 久久免费国产精品1| 热99在线视频| 国模叶桐国产精品一区| 欧美日韩国产成人在线观看| 久久不射热爱视频精品| 欧美激情国内偷拍| 久久久久国产精品免费网站| 欧美激情二区三区| 日本午夜精品理论片a级appf发布| 亚洲人成网站777色婷婷| 国产精品视频一区二区高潮| 国产精品日韩一区| 成人在线视频福利| 日韩电影免费在线观看| 美女视频久久黄| 精品成人69xx.xyz| 国产精品都在这里| 黑人巨大精品欧美一区免费视频| 欧美高清视频在线| 精品日韩中文字幕| 亚洲免费一级电影| 精品视频在线导航| 不卡毛片在线看| xxx欧美精品| 色综合男人天堂| 欧美影院成年免费版| 国产一区玩具在线观看| 国产成人精品av在线| 久久国产精品网站| 庆余年2免费日韩剧观看大牛| 国产精品99久久久久久久久久久久| 久久精品国产一区| 成人免费视频a| 欧美激情a在线| 日本高清+成人网在线观看| 国产精品高精视频免费| 日韩成人在线电影网| 国产精品久久久久久中文字| 久久久久久久国产精品视频| 国产精品视频资源| 欧美性猛交xxxx免费看| 亚洲电影av在线| 最近2019年日本中文免费字幕| 国产精品扒开腿做| 97在线视频免费| 97在线免费观看| 91精品久久久久久久久久入口| 欧美日韩在线视频首页| 日韩av成人在线| 欧美成在线视频| 欧美一级大片在线观看| 亚洲成人中文字幕| 久久久久久久久久亚洲|