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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 原文:SQL Server自动化运维系列——监控磁盘剩余空间及SQL Server错误日志(Power Shell)需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等。
原文: 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 ="\\"+$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文件导入:

如此分析就方便多了。

 

结语 

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

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

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

 

如果您看了本篇博客,觉得对您有所收获,请不要吝啬您的“推荐”。 

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
20天前
|
消息中间件 运维 监控
智能运维,由你定义:SAE自定义日志与监控解决方案
通过引入 Sidecar 容器的技术,SAE 为用户提供了更强大的自定义日志与监控解决方案,帮助用户轻松实现日志采集、监控指标收集等功能。未来,SAE 将会支持 istio 多租场景,帮助用户更高效地部署和管理服务网格。
223 51
|
21天前
|
数据采集 运维 监控
数据采集监控与告警:错误重试、日志分析与自动化运维
本文探讨了数据采集技术从“简单采集”到自动化运维的演进。传统方式因反爬策略和网络波动常导致数据丢失,而引入错误重试、日志分析与自动化告警机制可显著提升系统稳定性与时效性。正方强调健全监控体系的重要性,反方则担忧复杂化带来的成本与安全风险。未来,结合AI与大数据技术,数据采集将向智能化、全自动方向发展,实现动态调整与智能识别反爬策略,降低人工干预需求。附带的Python示例展示了如何通过代理IP、重试策略及日志记录实现高效的数据采集程序。
数据采集监控与告警:错误重试、日志分析与自动化运维
|
1月前
|
消息中间件 运维 监控
智能运维,由你定义:SAE自定义日志与监控解决方案
SAE(Serverless应用引擎)是阿里云推出的全托管PaaS平台,致力于简化微服务应用开发与管理。为满足用户对可观测性和运维能力的更高需求,SAE引入Sidecar容器技术,实现日志采集、监控指标收集等功能扩展,且无需修改主应用代码。通过共享资源模式和独立资源模式,SAE平衡了资源灵活性与隔离性。同时,提供全链路运维能力,确保应用稳定性。未来,SAE将持续优化,支持更多场景,助力用户高效用云。
123 1
|
5月前
|
存储 运维 监控
API明细日志及运维统计日志全面提升API可运维性
在数字化转型的大潮中,数据已成为企业最宝贵的资产之一。而数据服务API可快速为数据应用提供数据接口。面对越来越多的API以及越来越多的应用调用,如何快速查看API的服务情况、异常情况及影响范围,以及查看API的调用详情,进行API的性能优化、错误排查变得越来越重要,本文将介绍如何配置和开通API运维统计及明细日志,以及如何查看日志进行介绍。
274 0
|
2月前
|
关系型数据库 MySQL
图解MySQL【日志】——磁盘 I/O 次数过高时优化的办法
当 MySQL 磁盘 I/O 次数过高时,可通过调整参数优化。控制刷盘时机以降低频率:组提交参数 `binlog_group_commit_sync_delay` 和 `binlog_group_commit_sync_no_delay_count` 调整等待时间和事务数量;`sync_binlog=N` 设置 write 和 fsync 频率,`innodb_flush_log_at_trx_commit=2` 使提交时只写入 Redo Log 文件,由 OS 择机持久化,但两者在 OS 崩溃时有丢失数据风险。
75 3
|
3月前
|
机器学习/深度学习 人工智能 运维
智能日志分析:用AI点亮运维的未来
智能日志分析:用AI点亮运维的未来
730 15
|
4月前
|
SQL
南大通用GBase 8a配置gcware日志等级,减少日志输出,节省磁盘IO
南大通用GBase 8a配置gcware日志等级,减少日志输出,节省磁盘IO
|
6月前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
86 1
|
6月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
177 2
|
6月前
|
运维 监控 数据可视化
出海运维日志通到底重要不重要?
出海运维日志通到底重要不重要?

热门文章

最新文章