SQL Server Management Studio 和 Microsoft SQL Server 代理提供了一种使用警报监视事件(例如复制代理事件)的方法。 SQL Server 代理监视与警报关联的事件的 Windows 应用程序日志。 如果发生此类事件,SQL Server 代理将通过执行已定义的任务以及/或向指定作员发送电子邮件或寻呼消息来自动响应。 SQL Server 包括一组针对复制代理的预定义警报,可以配置为执行任务和/或通知作员。 有关定义要执行的任务的详细信息,请参阅本主题中的“自动响应警报”部分。
将计算机配置为分发服务器时,将安装以下警报:
| 消息编号 | 预定义警报 | 导致警报触发的条件 | 在 msdb..sysreplicationalerts 中输入附加信息。 |
|---|---|---|---|
| 14150 | 复制:代理成功 | 代理已成功关闭。 | 是的 |
| 14151 | 复制:代理失败 | 代理关闭时出现错误。 | 是的 |
| 14152 | 复制:代理重试 | 代理在重试作失败后关闭(代理遇到服务器不可用、死锁、连接失败或超时失败)错误。 | 是的 |
| 14157 | 复制:已删除过期的订阅 | 已删除过期的订阅。 | 否 |
| 20572 | 复制:验证失败后重新初始化订阅 | 响应作业“在数据验证失败时重新初始化订阅”已成功初始化订阅。 | 否 |
| 20574 | 复制:订阅者的数据验证失败 | 分发或合并代理未能通过数据验证。 | 是的 |
| 20575 | 复制:订阅服务器已通过数据验证 | 分发或合并代理通过数据验证。 | 是的 |
| 20578 | 复制:代理自定义关闭 | ||
| 22815 | 对等冲突检测警报 | 分发代理在尝试在对等节点应用更改时检测到冲突。 | 是的 |
除了这些警报,复制监视器还提供一组与状态和性能相关的警告和警报。 有关详细信息,请参阅 复制监视器警报基础结构中的设置阈值和警告 。 有关详细信息,请参阅 创建 User-Defined 事件。
配置预定义的复制警报
- SQL Server Management Studio: 配置预定义复制警报(SQL Server Management Studio)
直接查看应用程序日志
若要查看 Windows 应用程序日志,请使用Microsoft Windows 事件查看器。 应用程序日志包含 SQL Server 错误消息以及计算机上的许多其他活动的消息。 与 SQL Server 错误日志不同,每次启动 SQL Server 时,不会创建新的应用程序日志(每个 SQL Server 会话将新事件写入现有应用程序日志):但是,可以指定将保留记录的事件的时长。 查看 Windows 应用程序日志时,可以为特定事件筛选日志。 有关详细信息,请参阅 Windows 文档。
自动化响应警报
复制为未通过数据验证的订阅提供响应作业,并提供用于创建对警报的其他自动响应的框架。 响应作业的标题为数据验证失败时重新初始化订阅,并存储在 SQL Server Management Studio 中的 SQL Server 代理作业文件夹中。 有关启用此响应作业的信息,请参阅“配置预定义复制警报”(SQL Server Management Studio)。 如果事务发布中的项目验证失败,则响应作业仅重新初始化那些失败的项目。 如果合并发布中的项目验证失败,响应作业将重新初始化发布中的所有项目。
自动化响应框架
通常,发生警报时,唯一能够帮助你了解警报原因以及采取相应措施的信息都包含在警报消息本身中。 分析此信息可能容易出错且耗时。 复制通过在 sysreplicationalerts 系统表中提供有关警报的其他信息,使自动化响应更加容易;提供的信息已经被解析成自定义程序易于使用的形式。
例如,如果订阅服务器 A 的 Sales.SalesOrderHeader 表中的数据验证失败,SQL Server 可以触发消息 20574,通知你该失败。 收到的消息为:“订阅者‘A’,在发布‘MyPublication’中对文章‘SalesOrderHeader’的订阅数据验证失败。”
如果基于消息创建响应,则必须从消息中手动解析订阅者名称、文章名称、出版物名称和错误。 但是,由于分发代理和合并代理将相同的信息写入 sysreplicationalert (以及代理类型、警报时间、发布数据库、订阅服务器数据库和发布类型等详细信息),因此响应作业可以直接从表中查询相关信息。 尽管无法将确切的行与警报的特定实例关联,但表中有一个状态列,可以用来跟踪已处理的条目。 此表中的条目保留历史记录保留期。
例如,如果要在服务警报消息 20574 Transact-SQL 中创建响应作业,则可以使用以下逻辑:
declare @publisher sysname, @publisher_db sysname, @publication sysname, @publication_type int, @article sysname, @subscriber sysname, @subscriber_db sysname, @alert_id int
declare hc cursor local for select publisher, publisher_db, publication, publication_type, article, subscriber,
subscriber_db, alert_id from
msdb..sysreplicationalerts where
alert_error_code = 20574 and status = 0
for read only
open hc
fetch hc into @publisher, @publisher_db, @publication, @publication_type, @article, @subscriber, @subscriber_db, @alert_id
while (@@fetch_status <> -1)
begin
/* Do custom work */
/* Update status to 1, which means the alert has been serviced. This prevents subsequent runs of this job from doing this again */
update msdb..sysreplicationalerts set status = 1 where alert_id = @alert_id
fetch hc into @publisher, @publisher_db, @publication, @publication_type, @article, @subscriber, @subscriber_db, @alert_id
end
close hc
deallocate hc