首页 > 代码库 > 6. SQL Server数据库监控 - 如何告警

6. SQL Server数据库监控 - 如何告警

原文:6. SQL Server数据库监控 - 如何告警

常用的告警方式大致有:短信、邮件、应用程序 (beep提示,图标提示,升窗提示等),可是不能一直坐在电脑前看着应用程序,或者用脚本部署监控,根本没有程序界面,所以通常用短信、邮件两种方式告警。

. 告警方式

1. 短信

用程序发短信的方式一般有这两种:

(1) 硬件

需要1张SIM卡,1个SIM卡读卡设备 (比如:短信猫),然后把设备连接到电脑,应用程序根据设备的软件接口,传参并发送短信。记得把SIM卡设备放在信号好,无干扰的地方;

如果有大量短信要发,1张SIM卡是不够用的,而且发送过度频繁,可能被运营商视为恶意短信,把SIM卡号加入黑名单,那么就需要多张SIM卡甚至多个读卡设备。

显示号码为当前SIM卡号码,大多供应商都支持DLL、HTTP等多种接口,当然也可以基于接口二次开发。

DLL接口方法参考:SmsManager.sendTextMessage(…)

 

(2) 第三方短信接口

有多种接口形式提供,比如:Web Service形式,HTTP形式,还有邮件接口:往1380013900@xxx.com发个短小的邮件,这个邮件会以短信的形式转发到手机上,等等。只要往接口传参数,告诉它发给谁,发什么内容,就可以了。

显示号码为某个SIM卡号码,或者为固定号码 (如:106开头的),这取决于短信平台和运营商的实现方式,因为运营商发短信是不要卡的,直接可以发给目标号码,而且可以显示为固定的某个号码。

Web Service接口地址参考:http://123.456.789.000/SmsManager.asmx?wsdl

Http接口地址参考:http://api.abc.xyz/sms/send.html

 

2. 邮件

凡是实现了SMTP协议的组件,都可以发送邮件。

在Windows环境下,有系统自带的组件CDO (Collaboration Data Objects,以前叫OLE Messaging 或者Active Messaging),是MAPI库的COM封装。不管是自己开发程序,使用VBS,还是SQL Server的SQL Mail/Database Mail,通常都是调用的这个组件。

SMTP协议要求的参数大致如下:

SMTP Hostname: SMTP服务器名,如mail.test.com或者IP

SMTP Port: SMTP服务端口,25

SMTP Username: 通过SMTP发送邮件用来验证的用户名, 如果不要求身份验证,留空

SMTP Password: 通过SMTP发送邮件用来验证的密码, 如果不要求身份验证,留空

 

. 选择告警方式并配置

1. 短信

不管是选择硬件,还是第三方接口,都需要一个程序来调用,可以是监控工具、脚本、甚至数据库。

(1)  监控工具/应用程序中,通常都留有短信接口的配置,配置接口地址即可;

(2) 在脚本中配置,Windows环境通常要借助OLE Automation;

OLE Automation后来改名叫Automation,是Windows上基于COM,用于脚本语言实现进程间通讯的机制,脚本如:VBS, SQL, Powershell,不包括BAT(BAT可以调用VBS)。

SQL Server中使用OLE Automation调用Web Service短信接口如下:

exec sp_configure show advanced options, 1;RECONFIGURE;exec sp_configure Ole Automation Procedures, 1;RECONFIGURE;declare @text_message nvarchar(180)       ,@phone_number nvarchar(15)       ,@soap_object  int       ,@status       int       ,@output       nvarchar(255)set @text_message = NTesting Mailset @phone_number = N138000139000--Create MSSOAP.SoapClient objectexec @status=sp_OACreate MSSOAP.SoapClient, @soap_object out--SmsManager is Web Service nameexec @status = sp_OAMethod @object, mssoapinit, null, http://123.456.789.000/SmsManager.asmx?wsdl, SmsManager--SendTextMessage is webservice methodexec @status = sp_OAMethod @object, SendTextMessage, @output OUT, @phone_number, @text_messageif @status <> 0begin   exec sp_OAGetErrorInfo @soap_object      select @soap_objectendelsebegin   select @outputend--Destroy MSSOAP.SoapClient objectexec @status = sp_OADestroy @soap_objectGO

对于HTTP, DLL接口,和SOAP接口类似,用OLE Automation也都可以调用,主要区别就是在CreateObject() 时。

以VBS为例,调用HTTP, DLL时CreateObject()如下:

Dim http Set http = CreateObject("Msxml2.XMLHTTP") Dim dllSet dll = CreateObject("工程名.类名")

 

2. 邮件

(1)  监控工具/应用程序中,通常都留有SMTP配置项,配置SMTP参数即可;

(2) 在脚本中配置,Windows环境通常要借助OLE Automation;

VBS发送邮件如下:

Dim nsns = "http://schemas.microsoft.com/cdo/configuration/"Dim title, contenttitle = "db_maint_alert"content = ""content = content&"Hi All,"content = content&chr(13)&chr(10)content = content&" "content = content&chr(13)&chr(10)content = content&"----test mail----"Msgbox(~1~‘)Set cm = CreateObject("CDO.Message")cm.from = "from_user_name@abc.com"    cm.to = "to_user_name@abc.com"cm.cc = "cc_user_name@abc.com"cm.subject = titlecm.textbody = contentcm.AddAttachment ""Msgbox(~2~‘)sendusing: 1 = pickup, 2 = portsmtpauthenticate: 0 = anonymous,1 = common,2 = NTLMsmtpusessl: 0 = no,1 = yesWith cm.configuration.fields    .item(ns & "sendusing") = 2    .item(ns & "smtpserver") = "xxx.xxx.xxx.xxx"    .item(ns & "smtpserverport") = 25    .item(ns & "smtpauthenticate") = 1    .item(ns & "sendusername") = "user_name@abc.com"    .item(ns & "sendpassword") = "*****************"    .item(ns & "smtpconnectiontimeout") = 10    .item(ns & "smtpusessl") = 0    .updateEnd WithMsgbox(~3~‘)cm.sendSet cm = nothingMsgbox(~success~‘)

 

SQL Server 2000发送邮件如下:

SQL Server 2000有SQL Mail,不过必须要同服务器上安装一个实现了MAPI的邮件程序,如:OUTLOOK,因为SQL Mail需要借用邮件应用程序的MAPI来发送邮件,配置起来不太方便,所以使用类似上面VBS的OLE Automation方法。

use master;if OBJECT_ID(sp_SendDatabaseMail) is not null     drop proc sp_SendDatabaseMailgoCREATE PROCEDURE sp_SendDatabaseMail        @recipients varchar(8000), --‘001@abc.com; 002@abc.com;‘        @Subject    varchar(400) = ‘‘,        @HtmlBody   varchar(8000) = ‘‘asDeclare @From varchar(100)Declare @To varchar(100)Declare @Bcc varchar(500)Declare @AddAttachment varchar(100)Declare @object intDeclare @hr intDeclare @source varchar(255) Declare @description varchar(500) Declare @output varchar(1000)    set @From = SqlAlert@abc.com    set @To = @recipients    set @Bcc = ‘‘    set @AddAttachment = ‘‘    --set @HtmlBody= ‘<body><h1><font color=Red>‘ +@HtmlBody+‘</font></h1></body>‘    EXEC @hr = sp_OACreate CDO.Message, @object OUT    EXEC @hr = sp_OASetProperty @object, Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value,2     EXEC @hr = sp_OASetProperty @object, Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value, xxx.xxx.xxx.xxx     EXEC @hr = sp_OASetProperty @object, Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value,25     EXEC @hr = sp_OASetProperty @object, Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value,1     EXEC @hr = sp_OASetProperty @object, Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername").Value,user_name@abc.com     EXEC @hr = sp_OASetProperty @object, Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value,*****************     EXEC @hr = sp_OAMethod @object, Configuration.Fields.Update, null     EXEC @hr = sp_OASetProperty @object, To, @To     EXEC @hr = sp_OASetProperty @object, Bcc, @Bcc     EXEC @hr = sp_OASetProperty @object, From, @From     EXEC @hr = sp_OASetProperty @object, Subject, @Subject     EXEC @hr = sp_OASetProperty @object, HtmlBody, @HtmlBody --add attachment    if @AddAttachment<>‘‘    EXEC @hr = sp_OAMethod @object, AddAttachment,NULL,@AddAttachment    IF @hr <>0     select @hr         BEGIN             EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT             IF @hr = 0                 BEGIN                     SELECT @output =  Source:  + @source                     PRINT @output                     SELECT @output =  Description:  + @description                     PRINT @output                 END             ELSE                 BEGIN                     PRINT  sp_OAGetErrorInfo failed.                     RETURN                 END         END --send mailEXEC @hr = sp_OAMethod @object, Send, NULL IF @hr <>0     select @hr         BEGIN             EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT             IF @hr = 0                 BEGIN                     SELECT @output =  Source:  + @source                     PRINT @output                     SELECT @output =  Description:  + @description                     PRINT @output                 END             ELSE                 BEGIN                     PRINT  sp_OAGetErrorInfo failed.                     RETURN                 END endPRINT Send Success!!! --destroy objectEXEC @hr = sp_OADestroy @object

调用上面这个SP来发邮件:

EXEC sp_SendDatabaseMail         @recipients = 001@test.com; 002@test.com;,         @body = This is a testing mail,        @HtmlBody = Testing Database Mail

 

SQL Server 2005起,使用Database Mail,脚本如下:

--1. 启用database mailuse masterGOexec sp_configure show advanced options,1reconfigureexec sp_configure Database mail XPs,1reconfigureGO--2. 添加accountexec msdb..sysmail_add_account_sp        @account_name            = SqlAlert                -- mail account       ,@email_address           = SqlAlert@test.com       -- sendmail address       ,@display_name            = SqlAlert                -- sendusername       ,@replyto_address         = null       ,@description             = null       ,@mailserver_name         = ***,***,***,***         -- SMTP Address       ,@mailserver_type         = SMTP                    -- SQL 2005 only support SMTP       ,@port                    = 25                        -- port       --,@username                = ‘*********@test.com‘    -- account       --,@password                = ‘******************‘    -- pwd       ,@use_default_credentials = 0       ,@enable_ssl              = 0                         --is ssl enabled on SMTP server       ,@account_id              = null--3. 添加profile exec msdb..sysmail_add_profile_sp             @profile_name = SqlAlert         -- profile name            ,@description  = dba mail profile -- profile description            ,@profile_id   = null--4. 关联account and profile exec msdb..sysmail_add_profileaccount_sp              @profile_name    = SqlAlert     -- profile name            ,@account_name    = SqlAlert     -- account name           ,@sequence_number = 1              -- account order in profile                                           --5. 发送database mailEXEC msdb.dbo.sp_send_dbmail         @profile_name = SqlAlert,        @recipients = 001@test.com; 002@test.com;,         @body = This is a testing mail,        @subject = Testing Database Mail;GO

注意:SMTP服务器的配置,比如:是否使用smtp用户验证,SSL是否开启,必须要和服务端一致,否则无法发送邮件。

 

其他

(1) 告警的次数:被告警的问题也许正在处理中,告警还在反复频繁发送,尤其用脚本轮询时,注意设置次数和发送间隔;

(2) 告警的历史记录:短信或者邮件告警,最好都在数据库中留一份记录;

(3) 字符编码:如果应用程序/接口不支持中文,可以把中文转成UTF-8的字符编码发送,然后再解析回来。

 

6. SQL Server数据库监控 - 如何告警