Resumable Space Allocation

Предположим, что вы выполняете очень длительное пакетное задание, и по какой-то причине оно сталкивается с недостатком места в базе данных 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 просто прервет операции до решения проблемы (например, добавлением файла данных для расширения пространства) и после этого автоматически продолжит их выполнение.

 

Возобновляемые операции

Следующие типы операций базы данных являются возобновляемыми.

 

Обычные восстанавливаемые ошибки

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

 

Использование средства 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 позволяет специфицировать время ожидания приостановленного сеанса до выхода по ошибке.

Вас заинтересует / Intresting for you:

Создание базы данных Oracle
Создание базы данных Oracle 34442 просмотров Александров Попков Wed, 14 Nov 2018, 12:44:39
Oracle и непроцедурный доступ ...
Oracle и непроцедурный доступ ... 8524 просмотров Antoni Tue, 21 Nov 2017, 13:32:50
Видеокурс по администрированию...
Видеокурс по администрированию... 10719 просмотров Илья Дергунов Mon, 14 May 2018, 05:08:47
Поддерживаемые Oracle типы дан...
Поддерживаемые Oracle типы дан... 9537 просмотров Валерий Павлюков Wed, 24 Oct 2018, 08:00:37
Печать
Войдите чтобы комментировать