从 SQL Server 监视链接的 SQL Server 组





5.00/5 (1投票)
从 SQL Server 监视链接的 SQL Server 组
引言
本文的主要目的是了解如何从一个 SQL Server 监控一组链接的 SQL 服务器。
在开始之前,我需要把一些事情说清楚
- 本文使用了**链接服务器技术和套接字编程**,我不会详细介绍这些内容,因为市面上已有相关的文章。但任何疑问、错误和建议都非常欢迎。
虽然对此主题的先验知识肯定会有帮助,但并非强制要求。 - 本文是关于一种执行监控的框架,因此你可能对如何实现有不同的想法。
用途
此项目可用于任何基本的数据库监控。但它特意为生产支持监控而设计,在这种情况下,需要监控数据库表中的特定数据。
我能提供的一个例子是针对银行业务领域,其中某些交易需要在预定的时间表上移动到下游系统。一旦这些交易被移动,它们的状态就会在数据库中更新为“已发送到下游系统”。
在这里,我们可以设置此监控来检查交易是否已发送?否则,就向生产支持人员发出警报!
监控架构
任何基本的监控系统都需要以下对象:
- 监控系统 - 监控系统并发出警报的对象
- 警报调度 - 用于定期调度监控系统(**点 1**)
- 警报分发器 - 分发警报
- 警报接收器 - 接收警报的系统
让我们来看看 SQL Server 为我们提供了上述哪些对象,以及我们需要开发哪些:
- **SQL 作业** - 用于警报调度(**点 2**)
- **链接服务器功能** - 用于监控系统(**点 1**)
剩余的组件“分发警报”和“接收警报”需要开发。
AlertDispatcher
- 这是一个简单的基于控制台的套接字客户端,用于将警报消息发送到监听的套接字服务器。AlertReceive
- 这是一个基于 MFC 对话框的套接字应用程序,用于显示 `AlertDispatcher` 发送的警报。
设置监控系统
在开始监控任何服务器之前,我们需要将远程 SQL 服务器注册为链接服务器。
要添加链接服务器,可以使用下面的代码,具体取决于身份验证方案。
A. Windows Authentication:-
EXEC sp_addlinkedserver
@server = 'LinkName',
@srvproduct = 'SQLServer OLEDB Provider',
@provider = 'SQLOLEDB',
@datasrc = 'ServerIP_OR_NAME'
EXEC sp_addlinkedsrvlogin 'LinkName', 'true', null, null, null
B. Sql Authentication:-
EXEC sp_addlinkedserver
@server = 'LinkName',
@srvproduct = 'SQLServer OLEDB Provider',
@provider = 'SQLOLEDB',
@datasrc = 'ServerIP_OR_NAME'
EXEC sp_addlinkedsrvlogin 'LinkName', 'false', null, _
'SQL_UserName', 'SQL_Password'
完成所有服务器的链接服务器设置后,您可以使用以下查询来检查连接性。
select * from OPENQUERY ( LinkName ,
'select top 1 * from sysobjects with (nolock) order by 1 desc' )
在上面的代码中,您需要将以下字符串替换为您本地的值。
LinkName
- 用于引用链接服务器的任何名称,也可以与链接服务器名称相同!ServerIP_OR_NAME
- 是 SQL 服务器的名称或 IP 地址。SQL_UserName
- 是链接服务器上的有效*SQL 用户*,该用户有权查询数据库。SQL_Password
- 猜猜是什么……是的,您猜对了,是密码。
警报调度
一旦链接服务器设置完成,下一步就是创建一个 SQL 作业。它将查询链接服务器以进行监控,并将警报传递给警报分发器。
作为代码一部分提供的示例作业每小时查询一次服务器表,以检查其中是否存在任何行。您可以重用示例作业来设置您自己的。
为了维护**警报接收器**列表,我们将创建一个表来持久化此信息。
Create Table MonitorIP
(
IPAddress varchar(25),
Sent_flag bit,
Port int
)
Insert into MonitorIP values
('IP_WHERE_ALERT_RECEIVER_WILL_BE_RUNNING', 1, 1002)
Insert into MonitorIP values
('IP_WHERE_ALERT_RECEIVER_WILL_BE_RUNNING', 1, 1002)
以下是一个用于监控表以检查数据是否存在的作业的示例 SQL 逻辑。
**注意:**您的 SQL 查询可能与此不同。
此查询将在作业按计划触发时在链接服务器上执行。此 SQL 查询执行两项操作:
- 它查询链接服务器并从中获取数据。
- 它检查行数是否大于一。如果找到,它将在 `AlertDispatcher.exe` 的帮助下将警报分发给所有接收器。
/*
Author : Kuldip Rindani
Create Date : 01-APR-2009
Purpose : For Dispatching Sample Alert using AlertDispatcher.exe
Dependencies : Script uses xp_cmdshell to execute a Exe.
therefore, it should be enabled on machine
were monitoring is setup.
Modification History :
*/
Declare @Row_Count int
Declare @ExePath varchar(255), @varMsg varchar(255), @varCmd varchar(2000)
Declare @IPAddress varchar(25), @Port varchar(10)
--Path for exe Need to customize as per site setup.
Set @ExePath = 'C:\Monitoring\AlertDispatcher.exe'
--Remember below is sample query for monitoring, your could be different than it.
--Below query is for checking if any Data is present is table for filter columns.
select @Row_Count = Row_Count from OpenQuery( LinkName,
'
Select count(*) as Row_Count from Your_Database..Your_Tables with _
(nolock) where Your_Columns = ''SOMEVALUE''
')
Set @varMsg = 'Date : ' + CAST(GETDATE() as varchar(50)) + ', _
Alert for Your_Database..Your_Tables on Your_Server = _
' + CAST(Row_Count as varchar(10))
--Below is sample logic for send Alert when data is present in Your_Database..Your_Tables
IF @Row_Count > 0
BEGIN
--Loop through each Registered Alert Receiver and dispatch the message
Declare C1 cursor For select IPAddress, Port from MonitorIP where sent_flag = 1
Open C1
Fetch Next From C1 InTo @IPAddress, @Port
While @@Fetch_Status <>-1
Begin
--Create the String for executing AlertDispatcher.exe utility.
set @varCmd = @ExePath + ' ' + @IPAddress + ' ' + _
@Port + ' "' + @varMsg + '"'
exec master..xp_cmdshell @varCmd
Fetch Next From C1 InTo @IPAddress, @Port
End
Close C1
Deallocate C1
END
注意:别忘了在上面的代码中将 `@ExePath` 变量替换为您环境中的实际路径。
警报分发器
这是一个简单的基于控制台的套接字客户端,用于将警报消息发送到监听的套接字服务器。此实用程序接受以下命令行参数来发送消息:
- IP 地址 / 计算机名称
- TCP 端口
- 要分发的消息。请记住,如果消息包含空格,则需要将其包含在引号(“”)中。
AlertDispatcher.exe 可以这样执行:
AlertDispatcher.exe localhost 1002 "DateTime, Test Message from AlertDispatcher"
警报接收器
这是一个基于 MFC 对话框的套接字应用程序,用于显示 `AlertDispatcher` 发送的警报。
此实用程序接受**端口号作为命令行参数**来监听来自警报分发器的传入消息。如果未提供,则**默认端口号为 1002**。
它期望**警报消息的格式为“日期时间, 警报消息”**,
即 `日期时间` 和 `消息` 文本用逗号分隔。
警报接收器的示例输出
上述输出
最后,所有对象都已正确设置。现在,只需要创建一个新作业来添加警报。此外,还可以通过禁用相应的 SQL 作业来暂时禁用现有作业。
特别感谢我的同事 Chaitanya Shah,他编写了**警报分发器**可执行文件。
历史
- 2009 年 6 月 24 日:初始发布