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

标签: sql server 数据库 | 发表时间:2014-10-15 09:55 | 作者:顺其自然EVO
出处:http://www.blogjava.net/qileilove/
 常用的告警方式大致有:短信、邮件、应用程序 (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 = N'Testing Mail'
set @phone_number = N'138000139000'
--Create MSSOAP.SoapClient object
exec @status=sp_OACreate 'MSSOAP.SoapClient', @soap_object out
--SmsManager is Web Service name
exec @status = sp_OAMethod @object, 'mssoapinit', null, 'http://123.456.789.000/SmsManager.asmx?wsdl', 'SmsManager'
--SendTextMessage is webservice method
exec @status = sp_OAMethod @object, 'SendTextMessage', @output OUT, @phone_number, @text_message
if @status <> 0
begin
exec sp_OAGetErrorInfo @soap_object
select @soap_object
end
else
begin
select @output
end
--Destroy MSSOAP.SoapClient object
exec @status = sp_OADestroy @soap_object
GO
  对于HTTP, DLL接口,和SOAP接口类似,用OLE Automation也都可以调用,主要区别就是在CreateObject() 时。
  以VBS为例,调用HTTP, DLL时CreateObject()如下:
  Dim http
  Set http = CreateObject("Msxml2.XMLHTTP")
  Dim dll
  Set dll = CreateObject("工程名.类名")
  2. 邮件
  (1)  监控工具/应用程序中,通常都留有SMTP配置项,配置SMTP参数即可;
  (2) 在脚本中配置,Windows环境通常要借助OLE Automation;
  VBS发送邮件如下:
Dim ns
ns = "http://schemas.microsoft.com/cdo/configuration/"
Dim title, content
title = "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 = title
cm.textbody = content
'cm.AddAttachment ""
Msgbox('~2~')
'sendusing: 1 = pickup, 2 = port
'smtpauthenticate: 0 = anonymous,1 = common,2 = NTLM
'smtpusessl: 0 = no,1 = yes
With 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
.update
End With
Msgbox('~3~')
cm.send
Set cm = nothing
Msgbox('~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_SendDatabaseMail
go
CREATE PROCEDURE sp_SendDatabaseMail
@recipients varchar(8000), --'001@abc.com; 002@abc.com;'
@Subject    varchar(400) = '',
@HtmlBody   varchar(8000) = ''
as
Declare @From varchar(100)
Declare @To varchar(100)
Declare @Bcc varchar(500)
Declare @AddAttachment varchar(100)
Declare @object int
Declare @hr int
Declare @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 mail
EXEC @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
end
PRINT 'Send Success!!!'
--destroy object
EXEC @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 mail
  use master
  GO
  exec sp_configure 'show advanced options',1
  reconfigure
  exec sp_configure 'Database mail XPs',1
  reconfigure
  GO
   --2. 添加account
  exec 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 mail
  EXEC 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的字符编码发送,然后再解析回来。


顺其自然EVO 2014-10-15 09:55 发表评论

相关 [sql server 数据库] 推荐:

SQL Server 数据库巡检脚本

- - CSDN博客数据库推荐文章
select '现在没有阻塞和死锁信息' as message. select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'. select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'.

大数据量下的SQL Server数据库自身优化

- - Oracle - 数据库 - ITeye博客
  1.1:增加次数据文件.   从SQL SERVER 2005开始,数据库不默认生成NDF数据文件,一般情况下有一个主数据文件(MDF)就够了,但是有些大型的数据库,由于信息很多,而且查询频繁,所以为了提高查询速度,可以把一些表或者一些表中的部分记录分开存储在不同的数据文件里.   由于CPU和内存的速度远大于硬盘的读写速度,所以可以把不同的数据文件放在不同的物理硬盘里,这样执行查询的时候,就可以让多个硬盘同时进行查询,以充分利用CPU和内存的性能,提高查询速度.

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

- - BlogJava-qileilove
 常用的告警方式大致有:短信、邮件、应用程序 (beep提示,图标提示,升窗提示等),可是不能一直坐在电脑前看着应用程序,或者用脚本部署监控,根本没有程序界面,所以通常用短信、邮件两种方式告警.   用程序发短信的方式一般有这两种:.   需要1张SIM卡,1个SIM卡读卡设备 (比如:短信猫),然后把设备连接到电脑,应用程序根据设备的软件接口,传参并发送短信.

SQL Server--索引

- - CSDN博客推荐文章
         1,概念:  数据库索引是对数据表中一个或多个列的值进行排序的结构,就像一本书的目录一样,索引提供了在行中快速查询特定行的能力..             2.1优点:  1,大大加快搜索数据的速度,这是引入索引的主要原因..                             2,创建唯一性索引,保证数据库表中每一行数据的唯一性..

SQL Server 面试

- - SQL - 编程语言 - ITeye博客
在SQL语言中,一个SELECT…FROM…WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句中的查询称为子查询. 子查询分为嵌套子查询和相关子查询两种. 嵌套子查询的求解方法是由里向外处理,即每个子查询在其上一级查询处理之前求解,子查询的结果作为其父查询的查询条件. 子查询只执行一次,且可以单独执行;.

SQL Server 得到数据库中所有表的名称及数据条数

- - CSDN博客推荐文章
提到单个表的数据条数,大家都会想到 select count(*) from tablename. 如果是要得到数据库中所有表的条数呢. --方法一 if exists ( select *. end close mCursor deallocate mCursor go --显示结果 select TableName,RowsCount from TableSpace --方法二 select b.name as tablename ,.

向Sql Server数据库中导入固定格式的txt文本数据

- - CSDN博客推荐文章
文本数据量比较大的时候,一条条的输入基本不可能,写个程序来中转一下也是很麻烦,幸运的是sql server提供了比较简洁的方法. 轻松搞定固定格式文本数据导入,比mysql的sql代码还要简洁. 作者:wj512416359 发表于2014-12-26 16:21:18 原文链接. 阅读:0 评论:0 查看评论.

SQL Server优化50法

- - CSDN博客推荐文章
虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决.   查询速度慢的原因很多,常见如下几种:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷).   I/O吞吐量小,形成了瓶颈效应.   没有创建计算列导致查询不优化.   内存不足网络速度慢查询出的数据量过大(可以采用多次查询,其他的方法降低数据量).

SQL Server 中的事务

- - CSDN博客推荐文章
       事务要有非常明确的开始和结束点,SQL Server 中的每一条数据操作语句,例如SELECT、INSERT、UPDATE和DELETE都是隐式事务的一部分. 即使只有一条语句,系统也会把这条语句当做一个事务,要么执行所有的语句,要么什么都不执行.         事务开始之后,事务所有的操作都会写到事务日志中,写到日志中的事务,一般有两种:一是针对数据的操作,例如插入、修改和删除,这些操作的对象是大量的数据;另一种是针对任务的操作,例如创建索引.

SQL Server优化50法

- - CSDN博客数据库推荐文章
  虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决.   查询速度慢的原因很多,常见如下几种:. 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小,形成了瓶颈效应. 查询出的数据量过大(可以采用多次查询,其他的方法降低数据量).