2023年11月27日发(作者:)

SQLServer告警全解析

SQL Server 告警全解析

为了确保数据库⽆故障运⾏,你必须得知道⼀些超出寻常范围内发⽣的事。你需要了解事件、错误条件、极限负载、硬件问题、安全问题、

性能相关条件、失败的进程、回滚、死锁、持久进程、昂贵的缓存执⾏计划,和⼀些导致信号问题的因素。仅仅偶尔查看错误⽇志是不够

的:你需要被通知。

最后,当WMI在SQL Server 2005中引⼊后,允许告警系统做WMI查询,因此第四类告警被添加。WMI告警系统是⼀个全⾯的覆盖了之

前系统确实的⽅⾯,但是对于忙碌的DBA来处理是相当复杂的。

当你想记录信息类消息,或者低安全级消息呢?如果你想对任何安全级⼩于19的错误拥有告警,你必须修改它们在sysmessages表中的⼊

⼝,设置为总是被记录。你可以使⽤带有WITH_LOG选项的sp_alterMessage来设置dLevel列为128。如果消息被修改为WITH_LOG,随

后将会被写⼊应⽤程序⽇志,⽽错误发⽣。即使不带WITH LOG选项执⾏RAISERROR,你已经修改的错误被写⼊应⽤程序⽇志,因此被

告警发现。有很多想去这样做的原因,因为它会记录⽇志,可选的发送告警,语法错误正常情况下只被最终⽤户看到。

你可以通过编程⽅式强制任何错误触发,使⽤带有WITH LOG参数的RAISERROR命令写⼊到错误⽇志。所以,对于⽤户定义的错误安全

级别(9),你可以记录⼀个事件,触发告警被激活,依次发电⼦邮件给某⼈,或运⾏⼀个作业,只需简单使⽤RAISERROR。通常,因为

相应告警的作业可以被代理以不同的⽤户运⾏,你不需要分配不安全的权限给普通⽤户。你可以使⽤xp_LogEvent,可能不想这个⽤户看

到错误。(只有Raiserror调⽤可以在错误消息中利⽤“Print”格式占位符,使⽤xp_logevent记录格式化消息到错误⽇志,以消息、字符

串格式标识符等)

错误安全级别

更⾼安全级别的错误你需要了解的更多,尤其是⽤户在应⽤程序中发现⼀条可怕的消息时打电话给你。

安全级别提供了最好的⽅式,创建⼀个多⽅⾯的告警系统,对于通常问题增补了特定的告警,例如TempDB运⾏空间不⾜。

安全级别1016

通常是⽤户错误产⽣的,⽤户执⾏TSQL脚本和存储过程的问题。⼤量的编程错误和输⼊问题可触发这类错误。问题是它们没有记录下来,

通常不可能别记录下来。

安全级别17(资源不⾜)和18(⾮致命内部错误被检测到)

被资源或系统错误产⽣;⽤户会话没有中断。

安全级别从1719

需要DBA注意,通过执⾏DBCC CHECKDB(database)获得更多信息,发现更多关于盘区损坏。安全级别19(SQL Server资源错误)将

会停⽌当前的批处理。

安全级别20(在当前进程中的SQL Server致命错误),21(在数据库dbid进程中的SQL Server致命错误),22SQL

Server致命错误可疑的表完整性),23SQL Server致命错误可疑的数据库完整性),24(硬件错误)和25

表明了系统问题。安全级别20或更⾼级别的错误消息被认为是致命错误,并结束客户端连接。这段错误消息会影响数据库中的所有进程,

也许表明数据库或对象已经损坏。这些错误对于此时运⾏的进程是致命的。进程将会记录诊断信息,然后终⽌。

标记:从告警到作业间传递信息

标记对于创建告警系统是⼗分重要的。如果你使⽤⼀个告警触发作业,将会有⼤量有⽤的信息传递给作业,被⽤于传递信息给准备处理问题

的系统。

这些信息以宏或标记的⽅式提供给作业。除了WMI标记,其他已经从SQL代理7.0和2000就已经有了。因为这些标记并不出名,我会列出

它们:

(A-SEV)错误安全级别以宏的形式从告警传递给作业

(A-MSG)消息⽂本以宏的形式从告警传递给作业(它将包含错误号码和安全级别作为字符串)

(DATE)当前⽇期(以YYYYMMDD格式)

(INST)实例名。对于默认实例,标记为空。

(JOBID)作业ID

警告:在SQL Server 2005,这些标记因为安全原因被禁⽤。在你使⽤这些标记之前,你必须启⽤它们,通过在对象浏览器中右键SQL

Server代理,选择属性,在告警系统页,选择“对于所有的作业替换标记相应告警”。

这⾥是⼀个作业步骤,从SQL Server事件写任何错误传递给它,包含完整的错误⽂本、安全级别和错误号码,因此你可以将它放到数据库

应⽤程序的⾃⼰私有⽇志中。你会看到它也包含数据库和服务器,你只需聚合这些消息到企业级报表中。

SQLServer:Access Methods

SQLServer:Backup Device

Windows Management Instrumentation告警

WMI告警⽐之前的类型提供更多的信息。请放⼼,你需要⼤量的时间让WMI告警⼯作。现在不是怯懦的时候。

在SQL Server 2005中,SQL Server代理在Windows Management Instrumentation(WMI)事件发⽣时触发告警。SQL Server代理

SQL Server维护多达九个SQL Server代理错误⽇志。每个归档⽇志有⼀个表名⽇志相对时间的扩展名。例如,扩展名.1表⽰最新的归档

错误⽇志,扩展名.9表⽰最⽼的归档错误⽇志。

10. 是否在作业步骤之间切换了标记的使⽤?(见上⾯)

11. 是否将你的标记包含在转义宏中?(见上⾯)

12. 在WMI管理应⽤程序来源的客户端,⼀个SQL Server实例上的Windows验证登录或组指定在应⽤程序的连接字符串中?