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

На мой взгляд, средство Alerts дает администратору великолепную возможность организовать своевременное предоставление информации в случаях, когда в системе SQL Server происходит какое-либо опасное, потенциально опасное или важное событие. Скажу больше, если бы я и захотел высказать претензии к функции Alerts агента SQL Server Agent, я бы отметил, что хотя эта функция и без того довольно мощная, в некоторых случаях она, пожалуй, слишком тесно интегрирована с WMI. Я хотел бы, чтобы в следующих версиях SQL Server средство Alerts было основательно переработано и оптимизировано, а также напрямую увязано с Extended Events и получило бы более удобные средства организации запросов и управления с помощью PowerShell. Впрочем, я отвлекся.

На большинстве серверов, работой которых мне приходится управлять, я, как правило, развертываю целый набор различных оповещений, которые перечислены ниже.

— Оповещения об ошибках с уровнем угроз 17-25. Внутри модуля SQL Server Agent администратор может установить оповещения или специализированные триггеры либо ответы на отдельные коды ошибок, которые попадаются модулю SQL Server Engine. Хотя вы можете установить оповещение для любого кода ошибки SQL Server, то есть для любой ошибки, упомянутой обработчиком SQL Server, оповещения не будут формироваться, если код ошибки или сообщение об ошибке не регистрируется как LOGGED. Вы можете установить еще один параметр – настроить Alerts на извещения об ошибках, представляющих угрозу определенного уровня. Лично меня ошибки с угрозами уровня 15 или ниже не волнуют — на них я просто не обращаю внимания. На некоторых серверах я выставляю для оповещений порог угрозы 16 и выше — в зависимости от количества фальшивых срабатываний, инициируемых кодом разработчика через THROW/RAISEERROR. Дело в том, что у меня нет никакого желания привыкать к регулярному появлению тревожных сообщений в папке входящих документов. Но на большинстве серверов я настоятельно рекомендую устанавливать настройки, предусматривающие оповещение администратора об ошибках с уровнем угрозы 17-25, поскольку ошибки именно этого диапазона почти всегда требуют внимания или, по меньшей мере, оповещения администраторов баз данных. Из этого правила нередко бывают исключения, вызываемые нарушениями связи с клиентами, что определяется контекстами Kerberos и SSPI. Чтобы внести эти исключения, вы можете просто открыть узел SQL Server Agent > Alerts, щелкнуть правой кнопкой мыши и выбрать элемент New Alert. После этого вы сможете ввести имя, которое хотели бы использовать для идентификации данного оповещения, и далее указать, желаете ли вы, чтобы оповещение появлялось после возникновения ошибки с конкретным или специфическим кодом или чтобы оповещение было привязано к угрозе заданного уровня — скажем, уровня 17. Далее на панели или вкладке Response вы можете определить, как системе следует реагировать на возникновение этой ошибки. Это может быть отправка электронного сообщения (правда, в данном случае администратору необходимо предварительно корректно настроить Database Mail системы SQL Serve и SQL Server Agent таким образом, чтобы он мог использовать эту возможность для оповещения). Существует и другая возможность: предписать этим оповещениям запускать или выполнять задания. Реализация последнего варианта предполагает выполнение утомительной работы — формирования особого оповещения для угрозы каждого уровня: одно для ошибок с угрозой уровня 17, другое для уровня 18 и так далее до уровня 25. Поэтому я включил в данный раздел сценарий (приведенный в статье), который можно использовать для формирования оповещений по угрозам уровней от 17 до 25. Для этого требуется просто заменить параметры именами оператора, которого вы хотите известить, так что вы можете закончить всю подготовку за несколько секунд, если уже не сделали этого.

— Оповещения по проблемам ввода-вывода и хранилища данных. Регулярные проверки данных на целостность — ключевая задача, решением которой должны заниматься все администраторы баз данных. Но надо сказать, что дополнительным и ключевым компонентом обеспечения целостности данных является ранняя диагностика. Система оповещений об ошибках и проблемах в подсистеме ввода-вывода должна быть отлажена на любом SQL Server.

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

— Оповещения о взаимоблокировках. Я не устанавливаю эти оповещения на каждом сервере. Но в ситуациях, когда на сервере часто происходят взаимоблокировки, предусмотреть такие оповещения стоит.

— Оповещения о транзакциях с длительным сроком выполнения. Мой подход к ним примерно такой же, как и к описанным выше. Я не устанавливаю их на каждом сервере, но применяю оповещения о транзакциях с длительным сроком выполнения в ситуациях, в которых по моим представлениям могут возникнуть проблемы или имеются жалобы на нерешенные вопросы, касающиеся замедления работы и блокировок. Отмечу, кстати, что эти оповещения настраиваются как задания (JOB), а не как фактические оповещения агента SQL Server (SQL Server Agent Alerts). Думаю, что если бы я захотел решить проблему, связанную с внутренними компонентами WMI, я бы, наверное, нашел аналогичный способ сделать это напрямую с помощью SQL Server Agent Alerts. У меня просто не было времени, да и желания, заниматься такими делами.

— Оповещения, касающиеся дискового пространства. Они тоже относятся к категории оповещений, которые необязательно устанавливать на каждом сервере, и не реализуются непосредственно через функцию SQL Server Agent Alerts (не исключаю, что имеется какая-то возможность сделать это с помощью WMI). Но, как и в случае с другими оповещениями, включенными в настоящий список, эта функция такова, что если вы решите, что ее нужно установить на основном сервере, вам придется обеспечить ее синхронизацию с другими серверами, на которых будут размещаться группы доступности AlwaysOn. В противном случае аварийное переключение на один из этих серверов может обернуться потерей любого из оповещений, предусмотренных для своевременного предупреждения администратора о потенциальных проблемах.

Аварийные переключения внутри групп доступности AlwaysOn и оповещения о потоках данных

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

К счастью, однако, обеспечить оповещение о проблемах, связанных с аварийными переключениями и/или о проблемах, относящихся к потокам данных, средствами групп доступности SQL Server совсем несложно (к сожалению, при зеркальном отображении базы данных дело обстояло совсем иначе). Для решения этой задачи нужно всего-то настроить три конкретных оповещения: для ошибок 1480, 35264 и 35265. Как отмечалось выше, каждое из этих оповещений можно создать вручную, раскрыв узел SQL Server Agent > Alerts, щелкнув правой кнопкой мыши и выбрав в открывшемся меню пункт New Alert. После чего нужно ввести детали, как показано на экране 1.

 

Настройка оповещений
Экран 1. Настройка оповещений

Далее на вкладке Response следует указать, какому оператору будут направляться электронные сообщения (см. экран 2).

 

Выбор оператора для получения
Экран 2. Выбор оператора для получения

После этого нужно повторить описанный процесс трижды — по одному разу для каждой ошибки. В конце концов вы получите результат, аналогичный показанному на экране 3.

 

Проверка установленных оповещений
Экран 3. Проверка установленных оповещений

Однако как показывает мой опыт, задачу формирования оповещений проще решить с помощью сценария. Я включил в статью сценарий (см. листинг 1), который использую для развертывания данных оповещений на серверах в процессе установки групп доступности AlwaysOn. Чтобы им воспользоваться, замените параметры и выполните сценарий; в результате вы получите три добавленных новых оповещения, которые будут направляться указанному вами оператору.

Дополнительный сценарий

А тем, кто пока еще не установил оповещения для ошибок с угрозами уровней 17-25, я предлагаю сценарий (см. листинг 2), который можно использовать для их установки — с помощью того же процесса.

Листинг 1. Сценарий настройки оповещений для указанных операторов

/*

ИНСТРУКЦИИ:

Замените параметры (CTRL+SHIFT+M или Query > Specify Values for Templates)

Более подробную информацию по параметрам можно найти по адресу:

http://www.sqlservervideos.com/video/sql-server-2008-t-sql-enhancements/

ПАРАМЕТРЫ:

— Имя оператора/псевдоним, которому следует направлять оповещения.

— Точечный рисунок типов уведомлений/вариантов: 1 = электронная почта, 2 = пейджер, 4 = NetSend

*/
— 1480 — AG Role Change (failover)
EXEC msdb.dbo.sp_add_alert
@name = N'AG Role Change',
@message_id = 1480,
@severity = 0,
@enabled = 1,
@delay_between_responses = 0,
@include_event_description_in = 1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name = N'AG Role Change',
@operator_name = N'',
@notification_method = ;
GO
— 35264 — AG Data Movement — Resumed
EXEC msdb.dbo.sp_add_alert
@name = N'AG Data Movement — Suspended',
@message_id = 35264,
@severity = 0,
@enabled = 1,
@delay_between_responses = 0,
@include_event_description_in = 1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name = N'AG Data Movement — Suspended',
@operator_name = N'',
@notification_method = ;
GO
— 35265 — AG Data Movement — Resumed
EXEC msdb.dbo.sp_add_alert
@name = N'AG Data Movement — Resumed',
@message_id = 35265,
@severity = 0,
@enabled = 1,
@delay_between_responses = 0,
@include_event_description_in = 1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name = N'AG Data Movement — Resumed',
@operator_name = N'',
@notification_method = ;
GO

 

Листинг 2. Сценарий настройки оповещений для ошибок с угрозами уровней 17-25

/*

ИНСТРУКЦИИ:

Замените параметры (CTRL+SHIFT+M или Query > Specify Values for Templates)

Более подробную информацию по параметрам можно найти по адресу:

http://www.sqlservervideos.com/video/sql-server-2008-t-sql-enhancements/

ПАРАМЕТРЫ:

— Имя оператора/псевдоним, которому следует направлять оповещения.

— Точечный рисунок типов уведомлений/вариантов: 1 = электронная почта, 2 = пейджер, 4 = NetSend

*/
EXEC msdb.dbo.sp_add_alert @name=N'Severity 017',
@message_id=0,
@severity=17,
@enabled=1,
@delay_between_responses=60,
@include_event_description_in=1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name=N'Severity 017',
@operator_name=N'',
@notification_method = ;
GO
EXEC msdb.dbo.sp_add_alert
@name=N'Severity 018',
@message_id=0,
@severity=18,
@enabled=1,
@delay_between_responses=60,
@include_event_description_in=1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name=N'Severity 018',
@operator_name=N'',
@notification_method = ;
GO
EXEC msdb.dbo.sp_add_alert
@name=N'Severity 019',
@message_id=0,
@severity=19,
@enabled=1,
@delay_between_responses=60,
@include_event_description_in=1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name=N'Severity 019',
@operator_name=N'',
@notification_method = ;
GO
EXEC msdb.dbo.sp_add_alert
@name=N'Severity 020',
@message_id=0,
@severity=20,
@enabled=1,
@delay_between_responses=60,
@include_event_description_in=1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name=N'Severity 020',
@operator_name=N'',
@notification_method = ;
GO
EXEC msdb.dbo.sp_add_alert
@name=N'Severity 021',
@message_id=0,
@severity=21,
@enabled=1,
@delay_between_responses=60,
@include_event_description_in=1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name=N'Severity 021',
@operator_name=N'',
@notification_method = ;
GO
EXEC msdb.dbo.sp_add_alert
@name=N'Severity 022',
@message_id=0,
@severity=22,
@enabled=1,
@delay_between_responses=60,
@include_event_description_in=1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name=N'Severity 022',
@operator_name=N'',
@notification_method = ;
GO
EXEC msdb.dbo.sp_add_alert
@name=N'Severity 023',
@message_id=0,
@severity=23,
@enabled=1,
@delay_between_responses=60,
@include_event_description_in=1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name=N'Severity 023',
@operator_name=N'',
@notification_method = ;
GO
EXEC msdb.dbo.sp_add_alert @name=N'Severity 024',
@message_id=0,
@severity=24,
@enabled=1,
@delay_between_responses=60,
@include_event_description_in=1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name=N'Severity 024',
@operator_name=N'',
@notification_method = ;
GO
EXEC msdb.dbo.sp_add_alert @name=N'Severity 025',
@message_id=0,
@severity=25,
@enabled=1,
@delay_between_responses=60,
@include_event_description_in=1;
GO
EXEC msdb.dbo.sp_add_notification
@alert_name=N'Severity 025',
@operator_name=N'',
@notification_method = ;
GO