当Replication发布者无法连接到订阅者系统时,SQL Server如何通过电子邮件发送错误消息

时间:2009-12-01 09:11:16

标签: sql-server-2005 database-replication

我们有几个远程位置,我们已经设置了SQL Server 2005复制。由于各种原因(例如

),出版商有时无法复制

1)网络问题,

2)订户关闭不当,

3)更改域密码

4)更改SQL密码,

5)无法打开用户系统。

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

谢谢, 泽。

3 个答案:

答案 0 :(得分: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并在“验证失败”上设置另一个警报。

答案 1 :(得分:1)

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

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

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

distribution agent configured with notify, pause, restart step

你会在上面的图片中注意到我添加了一个名为“通知,暂停,重试”的步骤,该步骤将在代理停止时执行(成功或失败 - 这是故意的,因为我正在使用连续复制计划并且只是想知道分发代理何时因任何原因而没有运行)。此步骤基本上会向特定组发送电子邮件,等待一两分钟,然后再次启动代理。您可以添加代码来执行任何您喜欢的操作,包括记录,在特定时间片中重新启动一定次数等。对于任意数量的代理,出版物等,它都可以轻松编写脚本并且可重复。(我有脚本确保任何新的任何类型的拓扑中的复制代理都包含这种类型的配置 - 然后只需将它们添加到发布工具或安排执行,具体取决于您在环境中的部署方式。

答案 2 :(得分:1)

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

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