65.9K
CodeProject 正在变化。 阅读更多。
Home

从 SQL Server 监视链接的 SQL Server 组

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2009年6月24日

CPOL

4分钟阅读

viewsIcon

35355

downloadIcon

310

从 SQL Server 监视链接的 SQL Server 组

引言

本文的主要目的是了解如何从一个 SQL Server 监控一组链接的 SQL 服务器。

在开始之前,我需要把一些事情说清楚

  1. 本文使用了**链接服务器技术和套接字编程**,我不会详细介绍这些内容,因为市面上已有相关的文章。但任何疑问、错误和建议都非常欢迎。
    虽然对此主题的先验知识肯定会有帮助,但并非强制要求。
  2. 本文是关于一种执行监控的框架,因此你可能对如何实现有不同的想法。

用途

此项目可用于任何基本的数据库监控。但它特意为生产支持监控而设计,在这种情况下,需要监控数据库表中的特定数据。

我能提供的一个例子是针对银行业务领域,其中某些交易需要在预定的时间表上移动到下游系统。一旦这些交易被移动,它们的状态就会在数据库中更新为“已发送到下游系统”。

在这里,我们可以设置此监控来检查交易是否已发送?否则,就向生产支持人员发出警报!

监控架构

任何基本的监控系统都需要以下对象:

  1. 监控系统 - 监控系统并发出警报的对象
  2. 警报调度 - 用于定期调度监控系统(**点 1**)
  3. 警报分发器 - 分发警报
  4. 警报接收器 - 接收警报的系统

让我们来看看 SQL Server 为我们提供了上述哪些对象,以及我们需要开发哪些:

  1. **SQL 作业** - 用于警报调度(**点 2**)
  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' ) 

在上面的代码中,您需要将以下字符串替换为您本地的值。

  1. LinkName - 用于引用链接服务器的任何名称,也可以与链接服务器名称相同!
  2. ServerIP_OR_NAME - 是 SQL 服务器的名称或 IP 地址。
  3. SQL_UserName - 是链接服务器上的有效*SQL 用户*,该用户有权查询数据库。
  4. 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 查询执行两项操作:

  1. 它查询链接服务器并从中获取数据。
  2. 它检查行数是否大于一。如果找到,它将在 `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` 变量替换为您环境中的实际路径。

警报分发器

这是一个简单的基于控制台的套接字客户端,用于将警报消息发送到监听的套接字服务器。此实用程序接受以下命令行参数来发送消息:

  1. IP 地址 / 计算机名称
  2. TCP 端口
  3. 要分发的消息。请记住,如果消息包含空格,则需要将其包含在引号(“”)中。

AlertDispatcher.exe 可以这样执行:

AlertDispatcher.exe localhost 1002 "DateTime, Test Message from AlertDispatcher"

警报接收器

这是一个基于 MFC 对话框的套接字应用程序,用于显示 `AlertDispatcher` 发送的警报。

此实用程序接受**端口号作为命令行参数**来监听来自警报分发器的传入消息。如果未提供,则**默认端口号为 1002**。

它期望**警报消息的格式为“日期时间, 警报消息”**,
即 `日期时间` 和 `消息` 文本用逗号分隔。

警报接收器的示例输出

AlertReceive_Output.JPG

上述输出

最后,所有对象都已正确设置。现在,只需要创建一个新作业来添加警报。此外,还可以通过禁用相应的 SQL 作业来暂时禁用现有作业。

特别感谢我的同事 Chaitanya Shah,他编写了**警报分发器**可执行文件。

历史

  • 2009 年 6 月 24 日:初始发布
© . All rights reserved.