需求描述shell
在咱们的生产环境中,大部分状况下须要有本身的运维体制,包括本身健康状态的检测等。若是发生异常,须要提早预警的,通知形式通常为发邮件告知。服务器
在全部的自检流程中最基础的一个就是磁盘剩余空间检测。做为一个高效的DBA不可能天天都要上生产机上查看磁盘剩余或者直到磁盘无剩余空间报错后才采起扩容措施。架构
固然,做为微软的服务器有着本身的监控软件:SCCM(System Center Configuration Manager)。但本篇就介绍若是经过Power shell实现状态值监控,相比SCCM更轻量级和更具灵活性。app
本篇实现运维
一、天天检测磁盘剩余空间大小,若是剩余空间超过了阀值,则发邮件告诉管理员测试
二、天天检测SQL Server运行的错误日志(Window平台的错误日志),造成邮件附件发送给管理员优化
监控脚本ui
首先咱们来解决第一个问题,关于磁盘剩余空间的问题,对于磁盘的监控的存在两个须要解决的问题:spa
<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 ="\\"+$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 } }
经过如上脚本,生成跑批任务,就能够自动的检测磁盘剩余空间了,而不须要咱们去手动检测了。
上述代码中,有两个技术点:一、须要本身配置SQL Server邮件代理;二、须要本身配置跑批计划,方法本身网上搜,很简单。
效果图以下
嘿...看到上面的邮件,就是须要联系硬件架构师,让其扩容或者清除冗余数据的时候了。
在上面的脚本中,的确只有个人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文件导入:
如此分析就方便多了。
结语
本篇就列举了一下利用PowerShell实现自动化运维和检测。算做抛砖引玉了吧,本身另有需求能够本身灵活实现。
关于SQL Server自动化运维和检测的内容很普遍,其中不少都是从平常的经验中出发,一步步的从手动到自动的过程。
后面的文章,咱们将会更深刻关于SQL Server的自动化优化运维进行分析。有兴趣的童鞋,能够提早关注。
若是您看了本篇博客,以为对您有所收获,请不要吝啬您的“推荐”。