需求描述

在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等。如果发生异常,需要提前预警的,通知形式一般为发邮件告知。

在所有的自检流程中最基础的一个就是磁盘剩余空间检测。作为一个高效的DBA不可能每天都要上生产机上查看磁盘剩余或者直到磁盘无剩余空间报错后才采取扩容措施。

当然,作为微软的服务器有着自己的监控软件:SCCM(System Center Configuration Manager)。但本篇就介绍如果通过Power shell实现状态值监控,相比SCCM更轻量级和更具灵活性。

本篇实现

1、每天检测磁盘剩余空间大小,如果剩余空间超过了阀值,则发邮件告诉管理员

2、每天检测SQL Server运行的错误日志(Window平台的错误日志),形成邮件附件发送给管理员

监控脚本

首先我们来解决第一个问题,关于磁盘剩余空间的问题,对于磁盘的监控的存在两个需要解决的问题:

<1>一般监控我们需要监控很多台服务器的磁盘,所以对于服务器的量控制我们需要生成一个配置文件。

  1. <computernames>
  2. <computername>
  3. wuxuelei-pc
  4. </computername>
  5. </computernames>

配置文件名字:computername.xml,这样就解决很多服务器的问题,只需要在配置文件中增加就可以,因为我在本地测试,所以就配置了我的本地电脑

<2>对于服务器的磁盘监控也需要定义一个阀值,用来动态改变,用来定义生成预警的阀值。简单点就是定义我们检测的磁盘剩余空间到了多少了就自动发邮件提醒。

  1. <Counters>
  2. <Counter alter = "10" operator = "gt" >C:</Counter>
  3. <Counter alter = "10" operator = "gt" >D:</Counter>
  4. <Counter alter = "10" operator = "gt" >E:</Counter>
  5. <Counter alter = "10" operator = "gt" >F:</Counter>
  6. </Counters>

文件名为:alter_disk.xml,我定义了四个盘符:C: D: E: F:

当以上四个盘符那个盘符少于10G了就生成邮件预警。

实现代码如下:

  1. $server = "(local)"
  2. $uid = "sa"
  3. $db="master"
  4. $pwd="password"
  5. $mailprfname = "TestMail"
  6. $recipients = "787449667@qq.com"
  7. $subject = "老大,快去看看这个服务器的磁盘空间马上就不够了!"
  8. $computernamexml = "F:\PowerShell\发送邮件\computername.xml"
  9. $alter_xml = "F:\PowerShell\发送邮件\alter_disk.xml"
  10. function GetServerName($xmlpath)
  11. {
  12. $xml = [xml] (Get-Content $xmlpath)
  13. $return = New-Object Collections.Generic.List[string]
  14. for($i = 0;$i -lt $xml.computernames.ChildNodes.Count;$i++)
  15. {
  16. if ( $xml.computernames.ChildNodes.Count -eq 1)
  17. {
  18. $cp = [string]$xml.computernames.computername
  19. }
  20. else
  21. {
  22. $cp = [string]$xml.computernames.computername[$i]
  23. }
  24. $return.Add($cp.Trim())
  25. }
  26. $return
  27. }
  28.  
  29. function GetAlterCounter($xmlpath)
  30. {
  31. $xml = [xml] (Get-Content $xmlpath)
  32. $return = New-Object Collections.Generic.List[string]
  33. $list = $xml.counters.Counter
  34. $list
  35. }
  36.  
  37. function CreateAlter($message)
  38. {
  39. $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
  40. $CnnString ="Server = $server; Database = $db;User Id = $uid; Password = $pwd"
  41. $SqlConnection.ConnectionString = $CnnString
  42. $CC = $SqlConnection.CreateCommand();
  43. if (-not ($SqlConnection.State -like "Open")) { $SqlConnection.Open() }
  44.  
  45. $cc.CommandText=
  46. " EXEC msdb..sp_send_dbmail
  47. @profile_name = '$mailprfname'
  48. ,@recipients = '$recipients'
  49. ,@body = '$message'
  50. ,@subject = '$subject'
  51. "
  52. $cc.ExecuteNonQuery()|out-null
  53. $SqlConnection.Close();
  54. }
  55.  
  56. $names = GetServerName($computernamexml)
  57. $pfcounters = GetAlterCounter($alter_xml)
  58. foreach($cp in $names)
  59. {
  60. $p = New-Object Collections.Generic.List[string]
  61. $report = ""
  62. foreach ($pfc in $pfcounters)
  63. {
  64. $b = ""
  65. $counter ="\\"+$cp+"\LogicalDisk("+$pfc.get_InnerText().Trim()+")\% Free Space"
  66. $p.Add($counter)
  67. }
  68. $count = Get-Counter $p
  69. #Write-Host $count.CounterSamples.Count;
  70. for ($i = 0; $i -lt $count.CounterSamples.Count; $i++)
  71. {
  72. $v = $count.CounterSamples.Get($i).CookedValue
  73. $pfc = $pfcounters[$i]
  74. #$pfc.get_InnerText()
  75. $b = ""
  76. $lg = ""
  77. if ($pfc.operator -eq "gt")
  78. {
  79. if( $v -le [double]$pfc.alter)
  80. {
  81. $b = "alter"
  82. $lg = "Less Than"
  83. }
  84. if($b -eq "alter")
  85. {
  86. $path = "机器名:"+$cp+"; 盘符:"+$pfc.get_InnerText()
  87. $diskFree="; 当前剩余空间为:"+[math]::truncate($v).ToString()+"G;"
  88. $aler=" 超过了你预定的阀值:"+$pfc.alter.Trim()+"G;速度去处理吧!"
  89. $item = "{0} {1} {2}" -f $path,$diskFree,$aler
  90. $report += $item + "`n"
  91. }
  92. }
  93. }
  94. if($report -ne "")
  95. {
  96. #生产警告 参数 计数器,阀值,当前值
  97. CreateAlter $report
  98. }
  99. }

通过如上脚本,生成跑批任务,就可以自动的检测磁盘剩余空间了,而不需要我们去手动检测了。

上述代码中,有两个技术点:1、需要自己配置SQL Server邮件代理;2、需要自己配置跑批计划,方法自己网上搜,很简单。

效果图如下

嘿...看到上面的邮件,就是需要联系硬件架构师,让其扩容或者清除冗余数据的时候了。

在上面的脚本中,的确只有我的F盘符超了阀值,所以警报了!

其次,我们来解决第二个问题,关于SQL Server错误日志的问题,作为日常的DBA管理系统中,查看SQL Server错误日志是一种常用的方式。当然,如果系统运行正常,不会产生错误日志,一单出现问题,就会生成错误日志,但是对于SQL Server错误日志会产生很多条,为了方便查找,我们会让其生成一个文本文件。

以邮件附件的形式,告知管理员,然后管理员就可以通过日志文件快速的定位问题的源头。

同样,本篇也是通过computername.xml文件,对多台服务器进行错误日志进行筛选

脚本很简单,如下

  1. $server = "(local)"
  2. $uid = "sa"
  3. $db="master"
  4. $pwd="password"
  5. $mailprfname = "TestMail"
  6. $recipients = "787449667@qq.com"
  7. $subject = "老大,快去看看这个服务器的SQL Server出问题了!"
  8. $Info="附件为SQL Server错误日志....."
  9. $computernamexml = "F:\PowerShell\发送邮件\computername.xml"
  10. function GetServerName($xmlpath)
  11. {
  12. $xml = [xml] (Get-Content $xmlpath)
  13. $return = New-Object Collections.Generic.List[string]
  14. for($i = 0;$i -lt $xml.computernames.ChildNodes.Count;$i++)
  15. {
  16. if ( $xml.computernames.ChildNodes.Count -eq 1)
  17. {
  18. $cp = [string]$xml.computernames.computername
  19. }
  20. else
  21. {
  22. $cp = [string]$xml.computernames.computername[$i]
  23. }
  24. $return.Add($cp.Trim())
  25. }
  26. $return
  27. }
  28.  
  29. function GetAlterCounter($xmlpath)
  30. {
  31. $xml = [xml] (Get-Content $xmlpath)
  32. $return = New-Object Collections.Generic.List[string]
  33. $list = $xml.counters.Counter
  34. $list
  35. }
  36.  
  37. function CreateAlter($message)
  38. {
  39. $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
  40. $CnnString ="Server = $server; Database = $db;User Id = $uid; Password = $pwd"
  41. $SqlConnection.ConnectionString = $CnnString
  42. $CC = $SqlConnection.CreateCommand();
  43. if (-not ($SqlConnection.State -like "Open")) { $SqlConnection.Open() }
  44.  
  45. $cc.CommandText=
  46. " EXEC msdb..sp_send_dbmail
  47. @profile_name = '$mailprfname'
  48. ,@recipients = '$recipients'
  49. ,@body = '$Info'
  50. ,@subject = '$subject'
  51. ,@file_attachments='$message'
  52. "
  53. $cc.ExecuteNonQuery()|out-null
  54. $SqlConnection.Close();
  55. }
  56.  
  57. $names = GetServerName($computernamexml)
  58. foreach($cp in $names)
  59. {
  60. #输出系统日志中某个特定程序的日志到文件,比如SQL Server,然后选择错误类型为Error
  61. Get-EventLog -ComputerName $cp application | where-object{$_.source-like "MSSQLSERVER"} | where-object{$_.entryType -eq "error"} >F:\PowerShell\$cp+"SQLErrLog.txt"
  62.  
  63. #生产警告 参数 计数器,阀值,当前值
  64. CreateAlter F:\PowerShell\$cp+"SQLErrLog.txt"
  65. }

效果图如下

直接下载附件,然后查看错误日志就可以了。

该错误日志还是挺详细的,发生时间,错误明细等

当然,上述脚本还欠缺一点逻辑:

比如:筛选一段时间周期的错误日志、或者只查看上次启动之后的错误日志等。

这些逻辑加上也不麻烦,本身PowerShell实现起来就很简单。这里就不展开了,自己灵活实现。

但是,在我们日常的分析中,在日志记录多的时候,用文本分析的方式还是比较慢,通常用Excel查看效果会好很多。

这个实现也不麻烦,只需要更改脚本如下:

  1. #输出系统日志中某个特定程序的日志到文件,比如SQL Server,然后选择错误类型为Error
  2. #Get-EventLog -ComputerName $cp application | where-object{$_.source-like "MSSQLSERVER"} | where-object{$_.entryType -eq "error"} >F:\PowerShell\$cp+"SQLErrLog.txt"
  3.  
  4. #输出系统日志中某个特定程序的日志到文件,比如SQL Server,然后选择错误类型为Error,支持Excel打开
  5. 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
  6.  
  7. #生产警告 参数 计数器,阀值,当前值
  8. CreateAlter F:\PowerShell\$cp+"SQLErrLog.xml"

我们下载生成的日志文件,然后打开Excel,然后选择:数据——>从Xml文件导入:

如此分析就方便多了。

结语

本篇就列举了一下利用PowerShell实现自动化运维和检测。算作抛砖引玉了吧,自己另有需求可以自己灵活实现。

关于SQL Server自动化运维和检测的内容很广泛,其中很多都是从日常的经验中出发,一步步的从手动到自动的过程。

后面的文章,我们将会更深入关于SQL Server的自动化优化运维进行分析。有兴趣的童鞋,可以提前关注。

SQL Server 自动化运维系列 - 监控磁盘剩余空间及SQL Server错误日志(Power Shell)的更多相关文章

  1. SQL Server自动化运维系列——监控磁盘剩余空间及SQL Server错误日志(Power Shell)

    需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...

  2. SQL Server自动化运维系列 - 监控磁盘剩余空间及SQL Server错误日志(Power Shell)

    需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在所有的自检流程中最基础的一个就是磁盘剩余空间检测. ...

  3. SQL Server自动化运维系列——监控跑批Job运行状态(Power Shell)

    需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 在上一篇文章中已经分析了SQL SERVER中关于邮 ...

  4. SQL Server自动化运维系列——监控性能指标脚本(Power Shell)

    需求描述 一般在生产环境中,有时候需要自动的检测指标值状态,如果发生异常,需要提前预警的,比如发邮件告知,本篇就介绍如果通过Power shell实现状态值监控 监控值范围 根据经验,作为DBA一般需 ...

  5. SQL Server自动化运维系列——关于邮件通知那点事(.Net开发人员的福利)

    需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等.如果发生异常,需要提前预警的,通知形式一般为发邮件告知. 邮件作为一种非常便利的预警实现方式,在及时性和易用性 ...

  6. SQL Server自动化运维系列——关于数据收集(多服务器数据收集和性能监控)

    需求描述 在生产环境中,很多情况下需要采集数据,用以定位问题或者形成基线. 关于SQL Server中的数据采集有着很多种的解决思路,可以采用Trace.Profile.SQLdiag.扩展事件等诸多 ...

  7. SQL Server自动化运维系列 - 多服务器数据收集和性能监控

    需求描述 在生产环境中,很多情况下需要采集数据,用以定位问题或者形成基线. 关于SQL Server中的数据采集有着很多种的解决思路,可以采用Trace.Profile.SQLdiag.扩展事件等诸多 ...

  8. SQL Server 自动化运维系列 - 多服务器数据收集和性能监控

    需求描述 在生产环境中,很多情况下需要采集数据,用以定位问题或者形成基线. 关于SQL Server中的数据采集有着很多种的解决思路,可以采用Trace.Profile.SQLdiag.扩展事件等诸多 ...

  9. SQL Server自动化运维系列——批量执行SQL脚本(Power Shell)

    需求描述 一般在生产环境中,在投产的情况下,需要批量的来执行SQL脚本文件,来完成整个投产,如果投产文件比较多的情况下,无疑这是一个比较痛苦的过程,所以本篇通过PowerShell脚本来批量完成. 监 ...

随机推荐

  1. neuroph Perceptron Sample

    错误: Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory     ...

  2. java自学入门心得体会 0.1

    之前记录了java的简介和基本语法 这里记载下对象和类 不太懂的我理解java对象和类的概念很模糊,因为有了 Abstract修饰符 让对象与类更加的扑朔迷离 - - 所以,就像很开放的语言,创建对象 ...

  3. 【Android实验】UI设计-Android计算器

    目录 实验目的 实验要求 实验过程 1. 界面设计 2. 功能设计 3. 运算处理 实验目的 自主完成一个简单APP的设计工作,综合应用已经学到的Android UI设计技巧,重点注意合理使用布局 实 ...

  4. UVa 1343 旋转游戏(dfs+IDA*)

    https://vjudge.net/problem/UVA-1343 题意:如图所示,一共有8个1,8个2和8个3,如何以最少的移动来使得中间8个格子都为同一个数. 思路:状态空间搜索问题. 用ID ...

  5. 关于C++中的友元函数的总结

    1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具 ...

  6. 51nod 1232 完美数 数位dp

    1232 完美数 题目来源: 胡仁东 基准时间限制:2 秒 空间限制:131072 KB  如果一个数能够被组成它的各个非0数字整除,则称它是完美数.例如:1-9都是完美数,10,11,12,101都 ...

  7. Codeforces 847H - Load Testing

    847H - Load Testing 思路:dp. 代码: #include<bits/stdc++.h> using namespace std; #define ll long lo ...

  8. JELLYFISH - Fast, Parallel k-mer Counting for DNA

    kmer分析其实是非常耗费计算资源的,如果我们自己写脚本来分析kmer的话,首先要将所有的序列打断成一定长度的kmer,然后将所有的kmer存储起来,最后统计每个kmer出现的频率,或者统计出现指定次 ...

  9. IntelliJ IDEA 进行多线程调试

      idea的断点有不同的模式,只有当Thread模式下才能调试多线程   断点设置步骤: 1.在断点上右键 2.选择Thread,然后点Done(建议选择Thread后点击make default把 ...

  10. 2018焦作网络赛Give Candies

    一开始忽略了欧拉定理指数部分是modphi(n-1)没有memset,减法后面没加0: