SQL Server的错误消息(Error Message)按照消息的严重级别一共划分25个等级,级别越高,表示严重性也越高。但是如果你统计sys.messages,你会发现,实际上只有16(SQL SERVER 2008/2012)或17个(SQL SERVER 2005)个级别。猜测应该是一些留作扩展用,一些留作用户自定义错误消息的级别。

sys.messages中有个字段is_event_logged,取值为1时表示出现错误时将消息记入事件日志。 对于 message_id 中的所有消息语言,此参数都是相同的。所以也就是说有些错误信息(Error Message)会写入事件日志,有些就不会写入错误日志。因此监控错误日志时,我们只能监控那些写入错误日志的错误信息。一般而言,我们应该监控严重级别在16~25之间的错误信息,另外严重级别14的也应该监控(主要是Error: 18456, Severity: 14)。

监控错误日志有很多方式,下面介绍一种非常简单、有效的监控错误日志的方法.我们可以通过sp_add_alert创建一个警报(Alerts),如下所示,我们创建一个名称为SQL Server Severity Event 14的警报(配置前需要配置邮件、ProfileName,Operators,下面脚本也要根据具体情况调整)。关于创建警报的具体信息,可以参考http://msdn.microsoft.com/zh-cn/library/ms189531.aspx

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

IF EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Severity Event 14')

 

 EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 14'

GO

 

USE [msdb]

GO

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 14',

  @message_id=0,

  @severity=14,

  @enabled=1,

  @delay_between_responses=60,

  @include_event_description_in=1,

  @category_name=N'DBA_MONITORING',

  @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 14', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

如下所示,在UAT服务器,我故意用dw账号错误密码登录数据库,一分钟后,我立马回收到一封告警邮件

DATE/TIME: ;        2014/10/28 9:21:42

 

DESCRIPTION: ;    Login failed for user 'dw'. Reason: Password did not match that for the login provided. [CLIENT: 192.xxx.xxx.xxx]

 

COMMENT: ;        (None)

 

JOB ;RUN:              (None)

 

SQL Server 错误日志

 

 

Windows事件日志

我们依次建立16-25级别的告警来监控数据库错误日志的错误信息。如下所示:

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Severity Event 16')

 

    EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 16'

GO

 

USE [msdb]

GO

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 16', 

        @message_id=0, 

        @severity=16, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 16', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 17')

EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 17'

GO

 

USE [msdb]

GO

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 17', 

        @message_id=0, 

        @severity=17, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 17', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 18')

 

    EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 18'

GO

 

USE [msdb]

GO

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 18', 

        @message_id=0, 

        @severity=18, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 18', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 19')

 

    EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 19'

GO

 

USE [msdb]

GO

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 19', 

        @message_id=0, 

        @severity=19, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

 

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 19', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 20')

    

        EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 20'

GO

 

USE [msdb]

GO

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 20', 

        @message_id=0, 

        @severity=20, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 20', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

 

USE [msdb]

GO

 

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 21')

 

    EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 21'

GO

 

USE [msdb]

GO

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 21', 

        @message_id=0, 

        @severity=21, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 21', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 22')

    

        EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 22'

GO

 

USE [msdb]

GO

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 22', 

        @message_id=0, 

        @severity=22, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 22', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 23')

    

        EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 23'

GO

 

USE [msdb]

GO

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 23', 

        @message_id=0, 

        @severity=23, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 23', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

 

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 23')

    

        EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 23'

GO

 

USE [msdb]

GO

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 23', 

        @message_id=0, 

        @severity=23, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 23', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 24')

    

        EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 24'

GO

 

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 24', 

        @message_id=0, 

        @severity=24, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 24', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

 

 

USE [msdb]

GO

 

IF NOT EXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING' AND category_class=2)

BEGIN

 

EXEC msdb.dbo.sp_add_category

    @class=N'ALERT',

    @type=N'NONE',

    @name=N'DBA_MONITORING' ;

 

END

GO

 

IF  EXISTS (SELECT name FROM msdb.dbo.sysalerts WHERE name = N'SQL Server Severity Event 25')

    

        EXEC msdb.dbo.sp_delete_alert @name=N'SQL Server Severity Event 25'

GO

 

 

 

 

EXEC msdb.dbo.sp_add_alert @name=N'SQL Server Severity Event 25', 

        @message_id=0, 

        @severity=25, 

        @enabled=1, 

        @delay_between_responses=60, 

        @include_event_description_in=1, 

        @category_name=N'DBA_MONITORING', 

        @job_id=N'00000000-0000-0000-0000-000000000000'

GO

 

 

EXEC msdb.dbo.sp_add_notification @alert_name=N'SQL Server Severity Event 25', @operator_name=N'YourSQLDba_Operator', @notification_method = 1

GO

 

执行完上面脚本后,就会建立下面几个告警。当数据库的错误日志出现这些级别的错误信息时,就会收到告警邮件。相当的方便、简单、高效。

MS SQL 监控错误日志的告警信息的更多相关文章

  1. MS SQL 监控数据/日志文件增长

        前几天,在所有数据库服务器部署了监控磁盘空间的存储过程和作业后(MS SQL 监控磁盘空间告警),今天突然收到了两封告警邮件,好吧,存储规划是一方面,但是,是不是要分析一下是什么原因造成磁盘空 ...

  2. 查看MS SQL SERVER 错误日志

    查看目的: 错误日志的查看是确保过程已成功完成(例如,备份和恢复操作,批处理命令,或其他脚本和过程).这可以帮助检测任何当前或潜在的问题,包括自动恢复信息(尤其是如果SQL Server实例已停止并重 ...

  3. 2. SQL Server数据库状态监控 - 错误日志

    原文:2. SQL Server数据库状态监控 - 错误日志 无论是操作系统 (Unix 或者Windows),还是应用程序 (Web 服务,数据库系统等等) ,通常都有自身的日志机制,以便故障时追溯 ...

  4. sql server 错误日志errorlog

    一 .概述 SQL Server 将某些系统事件和用户定义事件记录到 SQL Server 错误日志和 Microsoft Windows 应用程序日志中. 这两种日志都会自动给所有记录事件加上时间戳 ...

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

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

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

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

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

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

  8. SQL Server 错误日志过滤(ERRORLOG)

    一.背景 有一天我发现SQL Server服务器的错误日志中包括非常多关于sa用户的登陆错误信息:“Login failed for user 'sa'. 原因: 评估密码时出错.[客户端: XX.X ...

  9. SQL Server代理(5/12):理解SQL代理错误日志

    SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 如我们在这个系列的前几篇文章所见,SQL ...

随机推荐

  1. mysql乐观锁总结和实践--转

    原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...

  2. Excel基础

    一.基础 一个Excel文档称为工作簿(workbook).一个工作簿中可以包含多个工作表(sheet) ctrl+向右箭头  查看最后一列 ctrl+向下箭头 查看最后一行 二.合并单元格 三.等高 ...

  3. 1Z0-053 争议题目解析154

    1Z0-053 争议题目解析154 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 154.A database is running in ARCHIVELOG mode and ...

  4. 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)

    一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...

  5. js构建ui的统一异常处理方案(一)

    从早期从事基于java的服务器端开发,再到之后从事基于web和js的ui开发,总体感觉基于web页面的ui开发远不如服务器端健壮.主要是早期ie浏览器功能太弱小,很多业务被迫放到服务器端去实现,浏览器 ...

  6. URL的组成格式

    最近在学习js的Ajax方面的内容,发现自己对基础的计算机网络知识认识不足,所以大概了解了下. URL组成格式 图中中括号是可选项 protocol 协议,常用的协议是http hostname 主机 ...

  7. MongoDB-基础-条件操作符

    1.一些解释 less than         :  比..少  lt greater than      :  比..多  gt equals              :相等    e     ...

  8. 高效率去掉js数组中重复项

    Array类型并没有提供去重复的方法,如果要把数组的重复元素干掉,那得自己想办法: function unique(arr) { var result = [], isRepeated; for (v ...

  9. 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait

    [源码下载] 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait 作者:webabcd 介绍速战速决 之 PHP 类基础 抽象类 接口 trait 示例1.类的相关知识点 1(基础 ...

  10. Activity的四种启动模式

    Activity有四种启动模式: 1. standard,默认的启动模式,只要激活Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时有一个Activity的多个实例. 2. ...