2

我们在几个远程位置设置了 SQL Server 2005 复制。有时发布者由于各种原因无法复制,例如

1)网络问题,

2) 用户的不当关闭,

3) 更改域密码,

4) 更改 SQL 密码,

5) 未能开启用户系统。

有什么方法可以让 SQL 服务器在发生这种情况时向管理员发送电子邮件以便他检查?

谢谢,查克。

4

3 回答 3

3

至于检测代理问题,您想知道日志读取器和分发器何时停止。我的也是像 chadhoc 一样的连续复制,但我发现使用警报告诉我代理是否停止更容易。

USE [msdb] 
GO 
EXEC msdb.dbo.sp_add_alert  
    @name=N'Distribution agent stopped',   
    @message_id=0,  
    @severity=0,  
    @enabled=1,   
    @delay_between_responses=2160, 
    @include_event_description_in=1,   
    @category_name=N'[Uncategorized]',  
    @performance_condition=N'MSSQL$MYDATABASE:Replication Agents|Running|Distribution|=|0', 
    @job_id=N'00000000-0000-0000-0000-000000000000' 
GO 
EXEC msdb.dbo.sp_update_notification 
    @alert_name=N'Distribution agent stopped',   
    @operator_name=N'Amit',  
    @notification_method = 1 

验证/同步错误并不是那么容易检测到的。您可以设置一个夜间作业来运行sp_publication_validation并设置另一个关于“验证失败”的警报。

于 2010-02-03T00:37:12.030 回答
1

我通常处理这个问题的方法是修改负责启动/运行复制代理的 Sql Agent 作业(取决于您的复制拓扑,您将在可能不同的地方拥有各种它们)。只需在“运行代理”步骤之后添加一个作业步骤到适当的代理作业(即日志读取器代理、分发代理、合并代理、队列代理等),如果/当该步骤完成/失败时执行(取决于您是否使用连续计划)。

例如,如果我有一个事务性单向推送发布设置,分发代理将在分发服务器上运行。如果我连接到分发器并找到负责运行此发布的分发代理的 Sql Agent 作业,我可以修改该作业并添加一个步骤,以便在“运行代理”步骤失败/完成时向特定组发送电子邮件。如果我使用的是连续复制计划,我只需在“运行代理”步骤完成时将该步骤添加到电子邮件中(因为我希望在代理因任何原因停止时收到通知)。如果我使用的是非连续计划,我可能只在“运行代理”步骤失败时才运行电子邮件步骤。您甚至可以配置此“电子邮件”步骤来发送电子邮件,暂停一下,

这是一个屏幕截图,描述了按照我上面概述的方式配置的分发代理的作业步骤:

配置了通知、暂停、重启步骤的分发代理

您会在上面的图片中注意到,我添加了一个名为“通知、暂停、重试”的步骤,该步骤将在代理停止时执行(成功或失败 - 这是故意的,因为我正在使用连续复制计划并且只是想要知道何时分发代理由于某种原因没有运行)。这一步基本上是向特定组发送电子邮件,等待一两分钟,然后再次启动代理。您可以添加代码来做任何您喜欢的事情,包括日志记录、在特定时间片内仅重新启动特定次数等。对于任意数量的代理、出版物等,它很容易编写和重复。(我有脚本来确保任何新的任何类型拓扑中的复制代理都包括这种类型的配置 - 然后它'

于 2009-12-01T14:46:49.337 回答
1

我对复制不太了解,但sp_readerrorlog是一个非常有用的存储过程,允许您从数据库实例中访问数据库日志。如果需要,它可能允许您根据特定的错误消息做出更适当的响应,而不仅仅是来自代理作业的 SUCCESS/FAIL 分支。当然,您也可以直接从存储的过程中发送电子邮件,根据谁可以最好地响应错误(或白天的时间 - 白天/夜班协调员)来自定义收件人。

此外,考虑到您的潜在故障包括网络断开连接,如果工作成功而不是失败,发送电子邮件可能更合适?您可能希望在您的终端设置一个交换规则来监控此收件箱,如果它没有收到预期的成功消息,则会向您的管理员发出错误通知......人类非常善于过滤掉持续的刺激和缺乏很容易错过成功消息。另一方面,交易所总是(通常)保持警惕。

于 2009-12-01T15:04:29.473 回答