Лекция 31: Автоматизация административных задач
Оповещения
Оповещение – это действие, которое возникает на сервере в ответ на событие или состояние производительности. Оповещения могут реализоваться как уведомления операторам, могут инициировать запуск указанных заданий и могут перенаправлять события другому серверу. Событие – это ошибка или сообщение, которые записываются в журнал событий приложений Windows NT или Windows 2000 (вы можете просматривать этот журнал с помощью утилиты Event Viewer, поставляемой вместе с Windows NT или Windows 2000). Состояние производительности – это характеристика работы системы, доступная для мониторинга с помощью Performance Monitor (Windows NT) или System Monitor (Windows 2000), такая как процент использования ЦП или количество блокировок, используемых SQL Server. В этой лекции мы будем рассматривать System Monitor в Windows 2000, хотя Performance Monitor в Windows NT действует почти так же.
При возникновении какого-либо события служба SQLServerAgent сравнивает это событие со списком определенных вами оповещений, и если для этого события существует оповещение, то происходит запуск этого оповещения.
Запуск оповещения для определенного состояния производительности происходит в том случае, если указанный объект SQL Server в System Monitor достигает определенного порогового значения производительности, например, счетчик User Connections (Количество пользовательских соединений) внутри объекта General Statistics (Общая статистика) в System Monitor. Например, вы можете указать запуск оповещения, если значение этого счетчика достигнет 50. (О работе System Monitor описывается см. "Разрешение наиболее распространенных проблем производительности" .)
Протоколирование сообщений в журнале событий
Прежде чем перейти к созданию оповещения для какого-либо события, мы рассмотрим типы событий, которые приводят к передаче сообщений в журнал событий приложений Windows NT или Windows 2000; только эти события можно использовать для создания оповещений. События (или ошибки) с уровнем серьезности (severity level) от 19 до 25 автоматически передаются в журнал событий приложений Windows NT или Windows 2000 и поэтому могут использоваться для запуска оповещений. По умолчанию события с уровнем серьезности меньше 19 не протоколируются в журнале, и поэтому эти события не могут использоваться для запуска оповещений. Чтобы эти события протоколировались в журнале, вы должны использовать sp_altermessage, оператор RAISERROR WITH LOG или xp_logevent, позволяющие изменить статус протоколирования события или сообщения. В данном разделе вы узнаете, как создавать определенное пользователем сообщение о событии и как изменять это сообщение, чтобы обеспечить его запись в журнал событий приложений.
Создание определенного пользователем сообщения о событии
Вся информация для системных и определенных пользователем сообщений сохраняется в таблице sysmessages базы данных master. Чтобы создать определенное пользователем сообщение, используйте системную хранимую процедуру T-SQL sp_addmessage. Она имеет следующий синтаксис:
sp_addmessage [@msg_num =] msg_id, [@severity=] severity, [@msg_text=] 'msg_text' [,[@lang =] 'language'] [,[@with_log=] 'with_log'] [,[@replace =] 'replace']
Определенное пользователем сообщение должно иметь значение идентификатора сообщения ( msg_id ) 50001 или больше. Параметр severity – это уровень серьезности ошибки, на который ссылается сообщение, в диапазоне от 1 до 25, причем более высокие значения означают более высокий уровень серьезности ошибки. Уровни серьезности от 19 до 25 может задавать только системный администратор. Параметр msg_text – это текст сообщения об ошибке, который появится в журнале событий приложений при возникновении данной ошибки. Параметр language указывает, на каком языке будет написано сообщение, поскольку вместе с SQL Server может быть инсталлировано несколько языков. Параметр with_log (с журналом) может иметь значение TRUE или FALSE, указывая, будет ли данное сообщение всегда протоколироваться в журнале событий приложений Windows NT или Windows 2000. Значение по умолчанию – FALSE. Оператор RAISERROR WITH LOG (описывается в следующем разделе) изменяет это значение, если оно равно FALSE. Параметр replace (заменять) указывает, что данное сообщение должно заменять существующее сообщение, имеющее тот же номер идентификатора ( msg_id ).
Владельцы роли public имеют полномочия выполнения процедуры sp_addmessage, но чтобы создать сообщение с уровнем серьезности больше 18 или задать значение TRUE для параметра with_log, вы должны быть владельцем роли sysadmin.
Рассмотрим пример использования sp_addmessage. Следующий оператор создает новое сообщение, которое будет всегда протоколироваться в журнале событий (поскольку для параметра with_log задано значение TRUE ):
sp_addmessage 50001, 16, "Customer ID is out of range.", @with_log = "TRUE" GO
Изменение параметров протоколирования сообщения о событии
Предположим, что существующее сообщение, или сообщение, которое вы только что создали, не позволяет протоколировать его в журнале (или вы не включили параметр with_log ), как в следующем примере:
sp_addmessage 50001, 16, "Customer ID is out of range.", @with_log = "FALSE" GO
Если в дальнейшем вам потребуется протоколировать это сообщение в журнале, вы должны изменить его статус протоколирования. Для этого используйте процедуру sp_altermessage, чтобы всегда происходило протоколирование в журнале, как в следующем примере:
sp_altermessage 50001, WITH_LOG, "TRUE" GO
В качестве альтернативного средства вы можете использовать оператор RAISERROR с параметром WITH LOG, чтобы возвращать данное сообщение в ваше приложение, а также в журнал событий приложений и в журнал SQL Server. Например, следующий оператор отправляет в вашу программу сообщение 50001 с уровнем серьезности 16 и значением параметра состояния (state) 1, где state – это числовое значение, которое можно использовать для отслеживания, если сообщение передается более чем в одно местоположение:
RAISERROR (50001, 16, 1) WITH LOG GO
Чтобы изменить статус протоколирования сообщения вы можете также использовать расширенную хранимую процедуру xp_logevent, которая находится в базе данных master. При использовании этой процедуры сообщение передается в журнал событий и в журнал SQL Server, но не в клиентское приложение. Ниже приводится пример использования этой процедуры:
USE master GO xp_logevent 50002, "Customer ID out of range", warning GO
Первые два параметра являются обязательными: это идентификационный номер определенного пользователем сообщения (который, как уже говорилось, должен быть больше 50000) и текст сообщения, которое будет передаваться в эти журналы. Третий параметр (уровень серьезности) не является обязательным. Он может быть представлен одной из трех текстовых строк: informational (информационное), warning (предупреждение) или error (ошибка). Значение уровня серьезности определяет, какой тип значка появится рядом с сообщением в окне Event Viewer, чтобы вы могли легко отличать предупреждения от ошибок. Для Windows 2000 информационное сообщение снабжено синим значком "i", предупреждение – желтым значком "!" и ошибка – красным значком "X". Если уровень серьезности не задан, то по умолчанию используется значение informational.
Создание оповещения
Теперь мы готовы создать оповещение по событию и по состоянию производительности. Для создания оповещения вы можете использовать Enterprise Manager, T-SQL или SQL-DMO. И здесь мы будем рассматривать только методы использования Enterprise Manager и T-SQL, поскольку SQL-DMO выходит за рамки материала этой книги.