Раздел «Специальные действия»

Раздел «Специальные действия» содержит описание действий, которые утилита lhb должна выполнять в определенные моменты своей работы и/или при возникновении ошибочных ситуаций. Раздел не является обязательным, но если задается, то каждый оператор в нем должен быть представлен в единственном экземпляре.

Описание раздела
special:
   [< действия в начале работы >]
   [< действия в конце работы >]
   [< действия при ошибочной ситуации >]

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

Возможны два варианта выполнения < действий в начале работы > в зависимости от используемого сценария:

  1. сценарий содержит раздел «График выполнения» с указанием циклически осуществляемых операций (ежечасных, ежедневных и т.п.). В этом случае утилита lhb должна функционировать в режиме 24 часа в сутки, 7 дней в неделю, т.е. теоретически «вечно», поэтому < действия в начале работы > (опять-таки теоретически) будут выполнены всего лишь один раз в жизни утилиты. Если это так, то необходимость в программировании и отладке < действий в начале работы > отпадает (один раз эти действия администратор БД может выполнить и вручную). Однако, как показывает практика, реальная жизнь утилиты весьма далека от теоретической модели. Выполнение утилиты может быть прервано по разным причинам: сбой в оборудовании, аварийное завершение утилиты по собственной инициативе из-за неустранимых ошибок (оператор STOP), прекращение работы по инициативе администратора БД (например, в связи с необходимостью изменения файла сценария) и др. Таким образом, в реальной жизни повторные запуски утилиты lhb являются скорее не исключением, а правилом. В этой ситуации необходимость в разработке < действий в начале работы > становится актуальной, и степень актуальности зависит от частоты перезапуска утилиты lhb.

    В < действиях в начале работы > можно выделить следующие обычно задаваемые функции:

    • подготовительные операции (например, проверка наличия достаточного дискового пространства для размещения архивного файла, создание необходимых каталогов, возможность монтирования лентопротяжного устройства в случае создания архива на магнитной ленте, инициирование нарастающего архивирования – создание открытого архива и т.п.);

    • проверка результатов предыдущего запуска утилиты lhb и устранение выявленных нарушений в архиве (тестирование, по крайней мере, последней копии архивного файла и повторное создание архива).

  2. сценарий содержит раздел «График выполнения», но в разделе отсутствует описание циклически выполняемых операций (ежечасных, ежедневных и т.п.). В этом случае утилита lhb будет запускаться на выполнение всегда по инициативе администратора БД, и в < действия в начале работы > можно включить операции, которые обычно планируются в циклических операциях, например, удаление архивных файлов с истекшим сроком хранения.

Указанные < действия в конце работы > выполняются утилитой только в случае её корректного завершения – по команде < CTRL >+< C > или с помощью оператора STOP (инициатива самой утилиты lhb). Если работа утилиты прекращена из-за отказа оборудования или операционной системы, то < действия в конце работы > не выполняются. Это свойство утилиты lhb может быть использовано, в частности, для определения способа завершения предыдущего запуска утилиты. Например, если в < действиях в начале работы > создать метку некоторого файла нулевой длины, а в < действиях в конце работы > удалить этот файл, то присутствие на диске указанного файла при запуске утилиты будет свидетельствовать о её предыдущем некорректном завершении.

Указанные < действия при ошибочной ситуации > определяют реакцию утилиты в случаях ошибочных ситуаций на глобальном уровне. На данный уровень обработки ошибок утилита выходит, если нет ни одного нижнего уровня, где выявленная ошибка могла быть обработка. Язык сценария предоставляет два способа обработки ошибок: с помощью конструкции iferr, относящейся непосредственно к оператору языка (раздел «Операторы языка сценария») и конструкции exception, объявляющей секцию обработки всех ошибок блока операторов, внутри которого расположена эта секция.

В утилите lhb предусмотрена следующая иерархия обработки ошибок:

  1. если синтаксис оператора предусматривает конструкцию iferr, и эта конструкция задана, то в случае выявления ошибки при выполнении оператора она обрабатывается так, как это предусмотрено в конструкции iferr данного оператора;

  2. если конструкция iferr не задана или не предусмотрена синтаксисом оператора, ошибка обрабатывается в секции exception текущего блока операторов;

  3. если текущий блок операторов не содержит секцию обработки ошибок, утилита пытается найти эту секцию на более высоком уровне вложенности блоков операторов. Если на каком-нибудь уровне вложенности секция обработки ошибок будет найдена, то ошибка обрабатывается в соответствии с правилами этой секции;

  4. если ни одной секции внутри блоков операторов не задано, ошибка будет обработана в глобальной секции (оператор iferr в разделе special);

  5. если глобальная секция обработки ошибок не определена, то ошибка будет проигнорирована. Последствия распространения этой ошибки на процесс архивирования (восстановления) БД полностью перекладываются на разработчика сценария.