Как SQL Server может отправить по электронной почте сообщение об ошибке, если издателю репликации не удается подключиться к системе подписчика

У нас есть несколько удаленных мест, где мы настроили репликацию SQL Server 2005. Иногда издатель не может тиражировать по разным причинам, таким как

1) проблемы с сетью,

2) неправильные отключения абонента,

3) смена паролей домена,

4) изменение паролей SQL,

5) сбой при включении абонентской системы.

Есть ли способ заставить SQL-сервер отправить администратору электронное письмо, когда это произойдет, чтобы он мог проверить?

Спасибо, Чак.

3 ответа

Решение

Обычно я справляюсь с этим, изменяя задания (ий) Sql Agent, которые отвечают за запуск / запуск агентов репликации (в зависимости от вашей топологии репликации их может быть множество в потенциально разных местах). Просто добавьте шаг задания в соответствующее задание (я) агента (т. Е. Агент чтения журнала, агент распространения, агент слияния, агент очереди и т. Д.) После шага "запустить агент", который выполняется, если / когда этот шаг завершается / завершается неудачей (в зависимости от того, используете ли вы непрерывный график или нет).

Например, если у меня настроена однонаправленная принудительная публикация транзакций, агент распространителя будет работать на распространителе. Если я подключусь к дистрибьютору и обнаружу, что задание Sql Agent отвечает за запуск агента распространителя для этой публикации, я могу изменить задание и добавить шаг для отправки электронного письма определенной группе, если шаг "Запустить агент" завершается неудачно / завершается. Если я использую расписание непрерывной репликации, я просто добавлю этот шаг в электронное письмо, если завершится шаг "Запустить агент" (так как я хочу получать уведомления, если агент останавливается по какой-либо причине). Если я использую непостоянное расписание, я могу вместо этого выполнить шаг электронной почты только в случае сбоя шага "Запустить агент". Вы даже можете настроить этот шаг "электронной почты" для отправки электронной почты, сделать небольшую паузу, а затем попытаться перезапустить агент автоматически (просто настроив шаг "перейти к шагу 1 в случае успеха").

Вот снимок экрана, на котором показано, как выглядят этапы работы для агента распространения, настроенного, как я обрисовал выше:

агент распространения, настроенный для уведомлений, приостановки, перезапуска, шаг http://i45.tinypic.com/2zs4aw9.jpg

На приведенном выше рисунке вы заметите, что я добавил шаг под названием "Уведомить, приостановить, повторить попытку", который будет выполняться каждый раз, когда агент останавливается (успех или сбой - это намеренно, поскольку я использую расписание непрерывной репликации и просто хочу знать, когда агент распространения не работает по какой-либо причине). Этот шаг в основном отправляет электронное письмо определенной группе, ждет минуту или две, а затем снова запускает агента. Вы можете добавить код, чтобы делать все, что вам нравится, включая ведение журнала, перезапуск только определенного количества раз в определенный промежуток времени и т. Д. Он легко сценариев и повторяется для любого числа агентов, публикаций и т. Д. (У меня есть сценарии, чтобы обеспечить любой новый Агент репликации в топологии любого типа включает в себя этот тип конфигурации - тогда это просто вопрос добавления их в инструмент выпуска или планирования выполнения, в зависимости от того, как вы внедряете в своей среде).

Что касается обнаружения проблем с агентом, вы хотите знать, когда программа чтения и распространения журнала остановлена. У меня также есть непрерывная репликация, как у 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 и настроить другое предупреждение на "Ошибка проверки".

Я не особо разбираюсь в репликации, но sp_readerrorlog - очень полезная хранимая процедура, позволяющая получить доступ к журналам БД из экземпляра базы данных. При необходимости это может позволить вам более адекватно реагировать на конкретные сообщения об ошибках, а не только на ветки SUCCESS/FAIL из задания агента. Конечно, вы также можете отправить электронное письмо непосредственно из сохраненного процесса, настраивая получателей в зависимости от того, кто лучше всего отреагирует на ошибку (или, например, время суток - дневная / ночная смены).

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

Другие вопросы по тегам