从Windows Application Log监控SQL Server错误日志并发送邮件告警

本文主要以Powershell脚本实现SQL Server错误日志监控并进行邮件告警:

从Windows Application Log中提取SQL Server实例错误日志,并针对每台服务器的实例进行邮件告警,代码如下:

在监控服务器搭建SQL Server并设置Database Mail,建立SQL Server Job,执行步骤的代码为PowerShell,执行帐号需要有各服务器的Event Log的读权限,远程连接权限,监控服务器的SQL Server权限等等(不一一列出,可自行进行调试,如果嫌麻烦,则直接授予管理员权限)

1、设置监控的频率,代码中为30分钟收集一次,同时Sqlserver Agent Job的schedule设置为每30分钟执行一次

2、E:\\DBA\\Svrlist.txt中存放服务器与SQL实例名,格式为   服务器名:实例1,实例2   服务器名与实例名之间以:间隔,实例名与实例名之间以,间隔。如果只有服务器名,则采用默认实例名MSSQLSERVER

3、E:\\DBA\\maillist.txt中存放收件人列表,以;间隔

4、$MailStrNew=$MailStr -replace "'",""""  该处主要是替换日志中出现的单引号,避免该脚本执行报错

$today=Get-Date
$monitor_time=$today.addMinutes(-30) ## 30 minutes
$Svrlist= GC E:\\DBA\\Svrlist.txt ## ServerName:Instance1,Instance2
$db_instance="MonitorSQL" ## your monitor server sql server instance
$maillist=GC E:\\DBA\\maillist.txt ## MailAddr1;MailAddr2;
$mail_profiler_result=Invoke-Sqlcmd "select max(name) as name from msdb.dbo.sysmail_profile" -ServerInstance $db_instance ##change to your mail_profiler
$mail_profile=$mail_profiler_result.name
ForEach($svrname in $Svrlist){
$MailStr=""
if($svrname -like "*:*"){
$SvrArr=$svr -split ":"
$resultSet=Get-EventLog -LogName Application -EntryType Error -Source $SvrArr[1] -ComputerName $SvrArr[0] -After $monitor_time
$MailStr+=$SvrArr[0]
}
else{
$resultSet=Get-EventLog -LogName Application -EntryType Error -Source MSSQLSERVER -ComputerName $svrname -After $monitor_time
$MailStr+=$svrname
}

#echo $MailStr
ForEach($result in $resultSet){
$MailStr+="`n`n"+$result.Source+"`n"+$result.TimeGenerated.tostring("yyyy-MM-dd HH:mm:ss")+"`n"+$result.message
}
$MailStrNew=$MailStr -replace "'",""""
if($resultSet.length -gt 0){
Invoke-Sqlcmd "exec msdb.dbo.sp_send_dbmail @profile_name='$mail_profile',@recipients='$maillist',@subject='$svrname DataBase Error Log',@body=N'$MailStrNew';" -ServerInstance $db_instance
}
else{
echo $svrname "No Error`n"
}
}

如有不足之处,请多指出。有更好的方案及优化,可提出供大家相互学习,谢谢!

posted @ 2017-08-28 15:35  易语随风去  阅读(710)  评论(0编辑  收藏  举报