我们在多个远程位置设置了SQL Server2005复制。有时发布服务器由于各种原因而无法复制,例如
1)网络问题,
2)不适当地关闭订户,
3)域密码的改变,
4) SQL密码的更改,
5)用户系统开机失败。
有没有办法让SQL server在发生这种情况时给管理员发一封电子邮件,这样他就可以检查了?
谢谢,Chak。
发布于 2009-12-01 22:46:49
我通常的处理方法是修改负责启动/运行复制代理的Sql代理作业(根据您的复制拓扑,您可能会在不同的位置拥有不同的复制代理)。只需将作业步骤添加到相应的代理作业(即日志读取器代理、分发代理、合并代理、队列代理等)。在“运行代理”步骤之后,该步骤在该步骤完成/失败时执行(取决于您是否使用连续计划)。
例如,如果我有一个事务性单向推送发布设置,则分发代理将在分发服务器上运行。如果我连接到分发服务器并找到负责运行此发布的分发代理的Sql代理作业,则可以修改该作业并添加一个步骤,以便在“运行代理”步骤失败/完成时向特定组发送电子邮件。如果我使用的是连续复制计划,则在“运行代理”步骤完成时,我只需将该步骤添加到电子邮件中(因为我希望在代理因任何原因停止时收到通知)。如果我使用的是非连续计划,我可能只在“运行代理”步骤失败时才运行电子邮件步骤。您甚至可以配置此“电子邮件”步骤来发送电子邮件,暂停片刻,然后尝试自动重新启动代理(只需将该步骤配置为“成功时转到步骤1”)。
下面是一个屏幕截图,它描述了我在上面概述的配置的分发代理的作业步骤:

在上面的图片中你会注意到,我已经添加了一个叫做“通知,暂停,重试”的步骤,它将在代理停止时执行(成功或失败-这是故意的,因为我使用的是连续复制计划,只是想知道分发代理何时由于某种原因没有运行)。此步骤主要是向特定组发送一封电子邮件,等待一两分钟,然后再次启动代理。您可以添加代码来执行您喜欢的任何操作,包括日志记录、在特定时间片内仅重新启动特定次数等。它很容易脚本化,并且可以针对任意数量的代理、发布等进行重复。(我有一些脚本可以确保任何类型的拓扑中的任何新复制代理都包含这种类型的配置-然后只需将它们添加到发布工具中或安排执行,这取决于您在环境中部署的方式)。
发布于 2010-02-03 08:37:12
至于检测代理问题,您希望知道logreader和分发服务器何时停止。我的也是像chadhoc一样的连续复制,但我发现使用Alert来告诉我代理是否停止更容易。
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,并在“验证失败”时设置另一个警报。
发布于 2009-12-01 23:04:29
我对复制不是很了解,但是sp_readerrorlog是一个非常有用的存储过程,它允许您从数据库实例中访问数据库日志。如果需要,它可能允许您根据特定的错误消息做出更适当的响应,而不仅仅是代理作业的成功/失败分支。当然,您也可以直接从存储的进程中发送电子邮件,根据最能响应错误的人(或白天/夜间轮班协调员的时间)自定义收件人。
此外,考虑到您的潜在故障包括网络断开,如果作业成功而不是失败,发送电子邮件可能会更合适?您可能希望在您的终端上设置一个交换规则来监控此收件箱,并在未收到预期的成功消息时向您的管理员发出错误通知。message....humans非常擅长过滤掉持续不断的刺激,并且很容易错过成功消息的缺失。另一方面,交易所总是(通常)保持警惕。
https://stackoverflow.com/questions/1824939
复制相似问题