24. Планировщик заданий

В СУБД РЕД База Данных реализован встроенный планировщик заданий для выполнения плановых работ. Планировщик имеет возможность запускать задания по расписанию (с указанием интервалов времени и дней недели) и оповещать о запуске и завершении заданий, а также об ошибках. В качестве «задания» может выступать блок PSQL операторов или команды операционной системы.

Примечание

На данный момент планировщик заданий не работает на архитектуре Classic в Linux.

Задания сохраняются в базе данных scheduler.fdb в таблице SCH$SCHEDULED_JOBS. Путь к базе задается в файле конфигурации scheduler.conf в параметре SchedulerDatabase.

Таблица 24.1 Описание полей таблицы SCH$SCHEDULED_JOBS

Поле

Тип

Описание

SCH$JOB_NAME

CHAR(63)

Имя задания

SCH$JOB_ID

INTEGER

ID задания

SCH$JOB_SOURCE

BLOB TEXT

Код задания в текстовом виде

SCH$JOB_BLR

BLOB BINARY

Скомпилированный BLR для задания

SCH$DESCRIPTION

BLOB TEXT

Содержит описание задания

SCH$OWNER_NAME

CHAR(63)

Имя пользователя, создавшего задание

SCH$JOB_INACTIVE

SMALLINT

Имеет два значения:

1 - задание не будет запускаться по расписанию

0 - задание будет запускаться

SCH$JOB_TYPE

SMALLINT

Имеет два значения:

0 - обычное PSQL задание

1 - задание с командой ОС

SCH$JOB_SCHEDULE

VARBINARY(64)

Строка в формате cron, задающая расписание

SCH$START_DATE

TIMESTAMP

Дата и время начала выполнения задания

SCH$END_DATE

TIMESTAMP

Дата и время окончания выполнения задания

SCH$DATABASE

VARCHAR(255)

Имя базы данных, для которой создано задание

События, связанные с заданиями, регистрируются в таблице SCH$JOBS_LOG (scheduler.fdb).

Таблица 24.2 Описание полей таблицы SCH$JOBS_LOG

Поле

Тип

Описание

SCH$TIMESTAMP

TIMESTAMP

Время произошедшего события

SCH$JOB_NAME

CHAR(63)

Имя задания

SCH$JOB_ID

INTEGER

ID задания

SCH$EVENT

VARCHAR(32)

Регистрируются следующие типы событий:

RUN_START - начало выполнения задания;

RUN_FINISH - завершение выполнения задания;

RUN_ERROR - ошибка во время выполнения задания.

SCH$MESSAGE

VARCHAR(1023)

Текст ошибки

Так как к базе данных scheduler.fdb не имеет права подключаться никто, то для всех подключений доступны соответствующие виртуальные системные таблицы RDB$JOBS и RDB$JOBS_LOG (аналогичные таблицам SCH$SCHEDULED_JOBS и SCH$JOBS_LOG). В этих таблицах обычные пользователи видят информацию только о тех заданиях, которые они создали для любой базы данных; SYSDBA видит все задания для всех баз данных.

Каждое задание выполняется в отдельном подключении от имени пользователя, который его создал. Если необходимо прервать выполнение задания, то нужно удалить соответствующую строку из системной таблицы MON$ATTACHMENTS. Сведения об имени выполняемого задания можно увидеть в поле MON$CLIENT_VERSION.

Критические ошибки, при которых работа планировщика невозможна (например, отсутствие или повреждение базы данных scheduler.fdb), записываются в firebird.log.

24.1. Создание задания

Оператор создания задания становится доступным после подключения к базе данных с правами администратора или привилегией CREATE JOB.

Листинг 24.1 Синтаксис оператора создания задания CREATE JOB

CREATE JOB <имя_задания>
<параметры расписания>
[ACTIVE | INACTIVE]
[START DATE '<timestamp>' | NULL]
[END DATE '<timestamp>' | NULL]
{AS
    <объявления переменных>
BEGIN
    <блок sql-операторов>
END
| COMMAND '<команда>' }

 <параметры расписания> ::= '<Минуты> <Часы> <Дни_месяца> <Месяцы> <Дни_недели>'

Имя задания должно быть уникальным среди всех баз данных.

Ключевое слово ACTIVE (по умолчанию) указывает, что задание будет запускаться по расписанию. Ключевое слово INACTIVE означает, что задание запускаться не будет.

«Параметры расписания» задаются в виде строки в формате, аналогичном cron.

Необязательные предложения START DATE и END DATE задают промежуток времени, в котором будет запускаться задание, в формате 'ДД.ММ.ГГГГ ЧЧ:ММ'. Указанные значения включаются в интервал выполнения. Значение NULL используется, чтобы убрать интервал.

Предложение COMMAND дает возможность запланировать выполнение команды ОС. Такой тип заданий может создавать только SYSDBA. Чтобы задать список программ, которые можно использовать в команде, необходимо настроить параметр JobCommandAccess в scheduler.conf. В значении параметра можно указывать как пути к конкретным программам, так и директории с программами. По умолчанию разрешено использовать только программы из директории СУБД.

Задание выполняется от имени пользователя, который его создал.

24.2. Изменение задания

Синтаксис изменения задания аналогичен его созданию:

Листинг 24.2 Синтаксис оператора изменения задания ALTER JOB

ALTER JOB <имя_задания>
[<параметры расписания>]
[ACTIVE | INACTIVE]
[START DATE '<timestamp>' | NULL]
[END DATE '<timestamp>' | NULL]
[AS
    <объявления переменных>
BEGIN
    <блок sql-операторов>
END
| COMMAND '<команда>' ]

<параметры расписания> ::= '<Минуты> <Часы> <Дни_месяца> <Месяцы> <Дни_недели>'

Изменить задание может его создатель и SYSDBA.

24.3. Удаление задания

Оператор удаления задания доступен создателю задания и SYSDBA.

Листинг 24.3 Синтаксис оператора удаления задания DROP JOB

DROP JOB <имя_задания>;

24.4. Оповещения

Для настройки оповещений о статусе заданий создан параметр JobNotificationCommand в scheduler.conf, в котором можно указать команду ОС. В команде можно использовать следующие переменные со сведениями о произошедшем событии:

  • $(timestamp) – дата и время события;

  • $(job_name) – имя задания;

  • $(job_id) – ID задания;

  • $(event) – тип события: RUN_START, RUN_FINISH или RUN_ERROR;

  • $(message) – сообщение с описанием ошибки.

Linux:

echo $(timestamp) $(job_name) $(job_id) $(event) $(message) >> /home/user/notifications.txt

Windows:

echo $(timestamp) $(job_name) $(job_id) $(event) $(message) >> C:\RDB\notifications.txt

24.5. Примечание для задания

Для существующего задания можно добавить комментарий, используя оператор COMMENT ON:

COMMENT ON
   JOB <имя задания> IS {'<текст примечания>' | NULL};

Значение NULL удаляет существующее примечание.

Примечание

Выполнить оператор COMMENT ON JOB могут администраторы, владельцы домена или пользователи с привилегией ALTER ANY JOB.