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

StackOverflow https://stackoverflow.com/questions/1824939

Вопрос

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

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

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

3) изменение паролей к домену,

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

5) невозможность включения абонентской системы.

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

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

Это было полезно?

Решение

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

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

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

distribution agent configured with notify, pause, restart step

На рисунке выше вы заметите, что я добавил шаг под названием «Уведомить, приостановить, повторить», который будет выполняться каждый раз, когда агент останавливается (успех или неудача — это намеренно, поскольку я использую график непрерывной репликации и просто хочу чтобы знать, когда агент распространения по какой-либо причине не работает).На этом этапе электронное письмо отправляется определенной группе, ждет минуту или две, а затем снова запускает агент.Вы можете добавить код, который будет делать все, что захотите, включая ведение журнала, перезапуск только определенное количество раз в определенном интервале времени и т. д.Его легко написать и повторить для любого количества агентов, публикаций и т. д.(У меня есть сценарии, гарантирующие, что любой новый агент репликации в любом типе топологии включает этот тип конфигурации - тогда это просто вопрос добавления их в инструмент выпуска или планирования выполнения, в зависимости от того, как вы развертываете в своей среде).

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top