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

需求描述html

在咱们的生产环境中,大部分状况下须要有本身的运维体制,包括本身健康状态的检测等。若是发生异常,须要提早预警的,通知形式通常为发邮件告知。服务器

在上一篇文章中已经分析了SQL SERVER中关于邮件的基础配置,本篇将利用此功能对多台Server的跑批Job进行监控。运维

本篇实现性能

一、天天检查服务器中的SQL Server跑批Job的运行状态,若是跑批失败,则发邮件告诉管理员失败的明细测试

二、解决多台服务器同时检查优化

 监控脚本ui

 首先咱们来解决第二个问题,关于多台服务器的问题:spa

 <1>通常监控咱们须要监控不少台服务器的JOb,因此对于服务器的量控制咱们须要生成一个配置文件。操作系统

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

配置文件名字:computername.xml,这样就解决不少服务器的问题,只须要在配置文件中增长就能够,由于我在本地测试,因此就配置了个人本地电脑代理

<2>利用Power Shell脚本,抓取出每台服务器的Job的状态,而且将Job的运行时间、运行状态、描述以及错误的步骤等信息整理,造成汇总邮件。

脚本以下:

$server = "(local)"
$uid = "sa"
$db="master"
$pwd="password"
$mailprfname = "TestMail"
$recipients = "787449667@qq.com"
$subject = "老大,快去看看这些服务器的Job跑失败了!"
$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
}

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();
}

$report = ""
$item = New-Object Collections.Generic.List[string]
$names = GetServerName($computernamexml)
foreach($cp in $names)
{
$srv=New-Object "Microsoft.SqlServer.Management.Smo.Server" "(local)"
$item=$srv.jobserver.jobs | where-object {$_.lastrunoutcome -eq "Failed" -and $_.isenabled -eq $TRUE} |  select OriginatingServer,name,Description,lastrunoutcome,lastrundate,JobSteps  
#Write-Host $item.JobSteps.name 
$report += " 服务器:"+$item.OriginatingServer+"  Job名称:"+$item.name+"  Job描述:"+$item.Description +"  Job最后运行状态:"+$item.lastrunoutcome  +"  Job最后运行时间:"+$item.lastrundate +"  Job失败的步骤名称:"+$item.JobSteps.name  + "`n"
}
#生产警告
CreateAlter $report

经过上述脚本,生成跑批任务,就能够定时监控多台服务器的Job了。

固然,建议放在全部Job的运行完成以后,进行检测。

上述代码中,有两个技术点:

一、须要本身配置SQL Server邮件代理,具体方法参照我上一篇:点击此

二、须要本身配置跑批计划,方法本身网上搜,很简单。

 

本篇所监控的Job状态,利用的是上一篇咱们建立的Job,跑批确定失败的。

效果图以下

点击来看一下邮件明细内容:

给出的失败信息仍是挺详细的。

另外,由于我只创建了一个失败的Job,因此邮件中只是发送一个条。

其实关于此监控,还有一些状态是能够监控的:

一、好比:能够指定服务器上的部分Job进行监控

二、监控Job的状态:失败或者正常等

以上内容,能够本身根据须要灵活配置。

结语 

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

另外关于Job,通常除了SQL Server的Agent会存在,还有一部分是操做系统的计划任务也须要检测,咱们后面的文章解决此问题。

关于SQL Server自动化运维和检测的内容很普遍,其中不少都是从平常的经验中出发,一步步的从手动到自动的过程。

后面的文章,咱们将会更深刻关于SQL Server的自动化优化运维进行分析。有兴趣的童鞋,能够提早关注。

 

文章的最后,给出该系列其它的一些监控方式,皆为原创

SQL Server须要监控哪些计数器

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

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

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

 

若是您看了本篇博客,以为对您有所收获,请不要吝啬您的“推荐”。 

相关文章
相关标签/搜索