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


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

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

2) ненадлежащее отключение абонента,

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

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

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

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

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

3 2

3 ответа:

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

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

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

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

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

Что касается обнаружения проблем с агентом,вы хотите знать, когда остановлены средство чтения журнала и распространитель. У меня тоже непрерывная репликация, как у чадхока, но мне проще использовать оповещение, чтобы сообщить мне, если агенты остановлены.

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 - это очень полезная хранимая процедура, позволяющая получить доступ к журналам БД из экземпляра базы данных. При необходимости это может позволить вам более адекватно реагировать на основе конкретных сообщений об ошибках, а не просто ветвей успеха/неудачи из задания агента. Вы, конечно, можете отправить электронное письмо непосредственно из сохраненного proc, настраивая получателей в зависимости от того, кто лучше всего реагирует на ошибку (или время суток - например, координаторы дневной / ночной смены).

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