Предположим, что вы выполняете очень длительное пакетное задание, и по какой-то причине оно сталкивается с недостатком места в базе данных Oracle Database — то ли из-за непредвиденного объема данных, то ли из-за сбоя, связанного с переполнением объектов, участвующих в транзакции DML. А может быть, произошла ошибка “достижения максимального количества экстентов” (maximum number of extents reached). Каковыми будут ваши действия в такой ситуации (которая неизбежно однажды возникнет)?
В большинстве случаев придется решить проблему с пространством или другими условиями, вызвавшими ошибку, а затем перезапустить транзакцию. Чаще всего вся операция отменяется, что занимает много времени. Иногда приходится даже перезапускать всю программу с самого начала, что потребует немалых затрат времени. В любом случае ваши действия, как администратора базы данных, ограничены возможностью перехвата ошибки после того, как она уже произошла, ее исправления и повторного выполнения операции. Средство Oracle Resumable Space Allocation (возобновление функционирования после устранения проблемы выделения пространства) приостановит операции базы данных, вызвавшие проблемы из-за недостатка места, и автоматически перезапустит эти операции после решения этих проблем с пространством. Средство Resumable Space Allocation очень полезно, если вы хотите обеспечить, чтобы ключевые задания по загрузке данных были выполнены в пределах временных рамок, даже если они столкнутся с проблемой недостатка пространства.
Совет. Чтобы воспользоваться всеми преимуществами средства Resumable Space Allocation, должны применяться локально управляемые табличные пространства вместе с Automatic Undo Management.
С помощью команды ALTER SESSION можно явно заставить операции выполняться в режиме Resumable Space Allocation. Средство Resumable Space Allocation просто прервет операции до решения проблемы (например, добавлением файла данных для расширения пространства) и после этого автоматически продолжит их выполнение.
Возобновляемые операции
Следующие типы операций базы данных являются возобновляемыми.
- Запросы. Эти операции всегда могут быть возобновлены после прерывания из-за недостатка пространства для сортировки.
- Операции DML. Операции вставки, обновления и удаления также могут быть продолжены после возникновения ошибки.
- Операции DDL. Операции с индексами, включающие создание, перестройку и изменение, также являются возобновляемыми, как и CREATE TABLE AS SELECT и ряд других операций DDL.
- Операции импорта и экспорта. Задания загрузки данных посредством SQL*Loader,столкнувшиеся с недостатком места, также могут быть возобновлены. Чтобы сделать эти операции возобновляемыми, при спецификации задания SQL*Loader необходимо использовать параметр RESUMABLE. Два других параметра возобновляемой операции — RESUMABLE_TIMEOUT и RESUMABLE_NAME — могут быть установлены только совместно с параметром RESUMABLE.
Обычные восстанавливаемые ошибки
Возобновлять операции можно после исправления следующих типов ошибок, возникших во время любой из операций.
- Ошибки недостатка пространства. Обычно операции дают сбой, когда вы не можете добавить экстенты к вашим таблицам и индексам из-за заполнения табличного пространства. Чтобы позволить объектам занять новый экстент и продолжать расти, потребуется добавить файл данных к табличному пространству. Типичное сообщение об ошибке Oracle в этом случае — ORA-01653.
- Ошибки максимального количества экстентов. Когда таблица или сегмент отката достигает заданного максимального числа, она не может расти дальше, даже при наличии свободного места в табличном пространстве. Вы получаете ошибку типа ORA-01628.
- Ошибки, связанные с превышением пользовательской квоты пространства. Если квота пространства в табличном пространстве, выделенная пользователю, исчерпана, операции в этом пространстве будут остановлены. Типичная ошибка Oracle в этом случае — ORA-01536.
Использование средства Resumable Space Allocation
Для применения средства Resumable Space Allocation пользователь должен иметь соответствующие привилегии:
SQL> GRANT RESUMABLE TO salapati; Grant succeeded. SQL>
Чтобы отобрать эту привилегию, используйте следующую команду:
SQL> REVOKE RESUMABLE FROM salapati; Revoke succeeded. SQL>
Включить Resumable Space Allocation в сеансе можно одним из двух способов: установить параметр инициализации RESUMABLE_TIMEOUT или же применить команду ALTER SESSION, чтобы включить или отключить возобновляемое выделение пространства. Оба метода обсуждаются в этой статье блога.
Использование параметра инициализации RESUMABLE_TIMEOUT
С помощью параметра инициализации RESUMABLE_TIMEOUT можно включать и отключать возобновляемое выделение пространства для всей системы в целом. Например, чтобы включить Resumable Space Allocation для всех сеансов базы данных на период длительностью два часа, этот параметр должен быть установлен следующим образом:
RESUMABLE_TIMEOUT=7200
Командой ALTER SYSTEM можно динамически изменять значение параметра RESUMABLE_TIMEOUT. Установка этого параметра в 0 приводит к динамическому отключению средства Resumable Space Allocation.
Использование оператора ALTER SESSION
Включить Resumable Space Allocation в сеансе можно с применением следующего оператора, независимо от установленного значения параметра инициализации RESUMABLE_TIMEOUT:
SQL> ALTER SESSION ENABLE RESUMABLE; Session altered. SQL>
Посредством оператора ALTER SESSION ENABLE TIMEOUT это средство отключается.
Указание интервала таймаута
С помощью необязательной конструкции TIMEOUT в операторе ALTER SESSION ENABLE RESUMABLE указывается интервал, в течение которого нужно будет решить проблему, вызванную приостановленной операцией. Если вы ничего не сделаете в течение заданного интервала, программа завершится с ошибкой ORA-30032 (“statement has timed out” — таймаут оператора), и вы уже не сможете возобновить ее с точки останова.
В следующем примере параметр TIMEOUT установлен в 18 000 секунд (5 часов).Таймаут по умолчанию установлен в Oracle равным 7 200 секунд. Если вы хотите изменить это значение по умолчанию, все, что для этого потребуется — выдать простую команду ALTER SESSION ENABLE RESUMABLE:
SQL> ALTER SESSION ENABLE RESUMABLE TIMEOUT 18000; Session altered. SQL>
На заметку! По умолчанию средство Resumable Space Allocation отключено для всех сеансов, если только значение параметра RESUMABLE_TIMEOUT не установлено в ненулевую величину.
Установить интервал таймаута можно также с использованием пакета DBMS_RESUMABLE,как показано ниже:
SQL> EXECUTE DBMS_RESUMABLE.set_session_timeout(4349,18000); PL/SQL procedure successfully completed. SQL>
В приведенном примере первое число в скобках, 4349, представляет идентификатор SID сеанса, для которого устанавливается таймаут. Если таймаут устанавливается для текущего сеанса, SID можно опустить. Второе число, 18000, задает сам период таймаута.
Именование возобновляемой операции
Иногда возобновляемой операции может понадобиться назначить имя, чтобы иметь возможность позднее отслеживать ее. Параметр NAME является не обязательным и не оказывает реального влияния на выполнение операций.
Назначение имени любой возобновляемой операции осуществляется следующим образом:
SQL> ALTER SESSION ENABLE RESUMABLE NAME 'resumable_test'; Session altered. SQL>
Внимание! Если операция приостановлена, то любые блокировки, удерживаемые Oracle на любых объектах базы данных, не будут освобождаться автоматически. Блокировки и прочие ресурсы будут освобождены только после того, как транзакция либо зафиксируется после возобновления, либо завершится с генерацией исключения.
Пример возобновляемой операции
Рассмотрим простой пример применения средства Resumable Space Allocation. Сначала журнал предупреждений показал следующее сообщение, говорящее о том,что оператор DML был приостановлен из-за переполнения табличного пространства отмены. Вместо немедленного выхода по ошибке оператор был просто приостановлен.
Fri Aug 1 11:15:00 2008 statement in resumable session 'User PASOWNER(11), Session 173, Instance 1' was suspended due to оператор в возобновляемом сеансе 'Пользователь PASOWNER(11), Сеанс 173, Экземпляр 1' был приостановлен из-за ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS_01' не удается расширить сегмент на 8 в табличном пространстве отмены 'UNDOTBS_01'
Как только проблема была решена добавлением места к табличному пространству (UNDOTBS_01), журнал предупреждений показал следующее сообщение, указывающее на то, что приостановленный оператор был возобновлен:
Fri Aug 1 11:21:52 2008 statement in resumable session 'User PASOWNER(11), Session 173, Instance 1' was resumed оператор в возобновляемом сеансе 'Пользователь PASOWNER(11), Сеанс 173, Экземпляр 1' был возобновлен
Если бы табличное пространство отмены не было расширено в течение интервала таймаута, то приостановленный оператор был бы прерван. Следующая запись из журнала предупреждений демонстрирует эту ситуацию:
Fri Aug 1 10:29:34 2008 Errors in file /a03/app/oracle/admin/pasx/bdump/pasx_smon_7091.trc: ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS_01' не удается расширить сегмент на 8 в табличном пространстве отмены 'UNDOTBS_01' Fri Aug 1 10:33:07 2008 statement in resumable session 'User PASOWNER(11), Session 184, Instance 1' was aborted оператор в возобновляемом сеансе 'Пользователь PASOWNER(11), Сеанс 184, Экземпляр 1' был прерван
Уведомление о приостановленной операции
В случае приостановки операции из-за проблем с недостатком пространства Oracle автоматически генерирует системное событие AFTER_SUSPEND. Если вы хотите получать автоматическое уведомление об этом событии, то можете написать триггер, который будет установлен на это событие, как показано ниже:
SQL> CREATE OR REPLACE TRIGGER page_dba AFTER SUSPEND ON DATABASE DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN /* Код, который известит администратора базы данных */ COMMIT; END; Trigger created. SQL>
Сигнал о приостановке операции
Когда Oracle приостанавливает возобновляемый сеанс, он автоматически выдает сигнал приостановки операции (operationsl-suspended alert) через автоматическое средство Server Generated Alerts (Сигналы, генерируемые сервером). Как только вы решите проблему, выделив необходимые ресурсы, и операция завершится, Oracle автоматически очистит этот сигнал.
Мониторинг Resumable Space Allocation
Возобновляемые операции отслеживаются с использованием представления DBA_RESUMABLE. Это представление показывает имя операции, идентификатор SID пользователя, время запуска оператора, полученное сообщение об ошибке, время приостановки и возобновления, а также текст и текущее состояние операторов SQL.Представление V$SESSION_WAIT также содержит информацию о приостановленных возобновляемых операторах. Столбец EVENT этого представления показывает, что оператор приостановлен, ожидая очистки “ошибки ожидания”.
Пакет DBMS_RESUMABLE содержит процедуры, которые помогают управлять приостановленным сеансом. Так, например, процедура SET_SESSION_TIMEOUT позволяет специфицировать время ожидания приостановленного сеанса до выхода по ошибке.