Поделиться через


Применение предупреждений по событиям агента репликации

Среда 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

Предупреждение об обнаружении конфликта в одноранговой топологии

Агент распространителя обнаружил конфликт при попытке применения изменений на одноранговом узле.

Да

Наряду с этими оповещениями монитор репликации предоставляет набор предупреждений и оповещений, относящихся к состоянию и производительности. Дополнительные сведения см. в разделе Настройка пороговых значений и предупреждений в мониторе репликации. Можно также определить предупреждения для других событий репликации при помощи инфраструктуры предупреждений SQL Server. Дополнительные сведения см. в разделе Создание определяемого пользователем события.

Настройка стандартных предупреждений репликации

Непосредственный просмотр журнала приложений

Для просмотра журнала приложений Windows используйте средство просмотра событий Microsoft Windows. Журнал приложений содержит сообщения об ошибках SQL Server, а также сообщения о многих других действиях на компьютере. В отличие от журнала ошибок SQL Server, новый журнал приложений не создается при каждом запуске SQL Server (в каждом сеансе SQL Server новые события записываются в существующий журнал приложений), однако можно указать время хранения записанных в журнал событий. При просмотре журнала приложений Windows можно отфильтровать журнал для поиска определенных событий. Дополнительные сведения см. в документации по Windows.

Автоматизация отклика на предупреждения

Репликация обеспечивает выполнение ответного задания для подписок, которые не прошли проверку данных, а также предоставляет платформу для создания дополнительных автоматизированных ответов на предупреждения. Ответное задание называется Повторная инициализация подписок при ошибке проверки и хранится в папке Задания агента SQL Server в среде SQL Server Management Studio. Сведения о включении этого ответного задания см. в разделе Как настроить предопределенные предупреждения репликации (среда SQL Server Management Studio). Если статьи в публикации транзакций не проходят проверку, ответное задание проводит повторную инициализацию только тех статей, которые не прошли проверку. Если статьи в публикации слиянием не проходят проверку, ответное задание повторно инициализирует все статьи публикации.

Платформа для автоматизации ответов

Обычно при возникновении предупреждения информация, позволяющая понять причину появления предупреждения и предпринять необходимые действия, содержится исключительно в самом предупреждающем сообщении. Анализ этой информации подвержен ошибкам и занимает немало времени. Репликация облегчает автоматическое реагирование, предоставляя дополнительную информацию о предупреждении в системной таблице sysreplicationalerts; эта информация уже представлена в форме, которая может быть легко использована пользовательскими программами.

Например, если данные в таблице Sales.SalesOrderHeader у подписчика «A» не прошли проверку, то SQL Server может выдать сообщение 20574, извещающее об этой ошибке. Выводится следующее сообщение: «Ошибка проверки данных подписки подписчика A на статью SalesOrderHeader в публикации MyPublication».

Если ответ создается на основе этого сообщения, необходимо вручную выделить из сообщения имя подписчика, имя статьи, имя публикации и ошибку. Однако поскольку агент распространителя и агент слияния записывают ту же информацию в таблицу sysreplicationalerts (вместе с подробными сведениями, такими как тип агента, время вывода предупреждения, база данных публикации, база данных подписчика и тип публикации), ответное задание может запросить соответствующую информацию непосредственно из таблицы. Хотя конкретную строку нельзя связать с определенным экземпляром предупреждения, в таблице имеется столбец status, который можно использовать для отслеживания тех записей, которые были обработаны. Записи этой таблицы сохраняются в течение срока хранения журнала.

Например, если бы нужно было создать в Transact-SQL ответное задание на предупреждение 20574, можно было бы использовать следующую логику:

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