Nvidal’s Blog

Just another WordPress.com weblog

Resumable space allocation

Resumable space allocation es una forma eficiente de mantener un proceso de larga duración en ejecución si la necesidad que el mismo aborte cuando se produzcan problemas de falta de espacios o que un export/import falle por la misma razón. Esto no es más que una forma eficiente de ahorrar tiempo y garantía de que las operaciones no fallen por falta de espacios o desbordamiento de los máximos tamaños de crecimientos definidos. Cuántas veces hemos visto un proceso en fase de finalización abortar por falta de espacio y tener que iniciarlo desde el inicio, o haciendo un import de una tabla gigante abortando al borde de la finalización, be my guess!

Managing Resumable Space Allocation

Oracle provee la forma de suspender y luego resumir la ejecución operaciones de la base de datos cuando ocurre un evento de fallas por alojamiento de espacio. Puedes tomar
Acciones correctivas envés que el servidor de oracle retorne un error al usuario. Después que el error es corregido, la operación suspendida automáticamente retoma la operación.
Esta característica de oracle es llamada Resumable Space Allocation. Las sentencias que son afectadas son llamadas resumable statements.

Como trabaja esto

1. Una sentencia se ejecuta en modo resumable solo si su sesión ha sido habilitada para resumable space allocation por una de la siguiente razón:

El RESUMABLE_TIMEOUT, parámetro de inicialización, es un valor mayor que cero.

El ALTER SESSION ENABLE RESUMABLE es ejecutado

2. Una sentencia resumable es suspendida cuando una de la siguiente condición ocurre:

• No espacio
• Máximo extents alcanzado
• Cuota de espacio excedida

3. Cuando la ejecución de una sentencia resumable es suspendida, hay mecanismos para ejecutar operaciones suplidora al usuario, log de errores y búsqueda del estado de la ejecución. Cuando una sentencia resumable es suspendida la siguientes acciones es tomada:

El error es reportado en Alert log.

El sistema activa una alerta de suspensión de la sesión
si el usuario tiene registrado un trigger AFTER SUSPEND, el trigger del usuario es ejecutado. Puedes utilizar un PL/SQL procedure para el acceso al mensaje de error usando el
Paquete DBMS_RESUMABLE y/o la vista el DBA_ o USER_RESUMABLE.

4. Suspendiendo la sentencia automáticamente resulta en suspender la transacción. Todos los recursos transaccionales son detenido atreves de la sentencia suspend o resume.

5. Cuando la condición de error es resuelta (como resultado de la intervención o quizás la liberación de espacio por otras sentencias), la sentencia suspendida automáticamente
Resume la ejecución y la alerta de la sesión resumable es limpiada.

6. Una sentencia suspendida puede forzar a terminar la ejecución usando el procedimiento DBMS_RESUMABLE.ABORT(). Este procedimiento puede ser llamado por un DBA o por el usuario que inicio la operación.

7. Una suspensión con intervalo de tiempo es asociada con una sentencia resumable. Una sentencia resumable que es suspendida por intervalo de tiempo (Default 2 horas) despierta y retorna la ejecución al usuario.

8. Una sentencia resumable puede ser suspendida y resumida múltiple veces durante su ejecución.

Las operaciones que son resumable son:

■ Queries
Las sentencias de SELECT que se quedan sin espacios temporales (por área de sort) son candidatas para ejecuciones resumable.

■ DML

INSERT, UPDATE, y DELETE son candidatos. También, INSERT INTO…SELECT de tablas externas pueden ser resumable.

■ Import/Export

■ DDL

Las siguientes sentencias son candidatas para ejecuciones resumable:

– CREATE TABLE … AS SELECT
– CREATE INDEX
– ALTER INDEX … REBUILD
– ALTER TABLE … MOVE PARTITION
– ALTER TABLE … SPLIT PARTITION
– ALTER INDEX … REBUILD PARTITION
– ALTER INDEX … SPLIT PARTITION
– CREATE MATERIALIZED VIEW
– CREATE MATERIALIZED VIEW LOG

Hay tres tipos de errores que pueden ser corregidos:

■ No espacio

La operacion no puede adquirir más extents por tabla/indice/temporalsegment/undo segment/cluster/LOB/Tabla e índice particionado en un tablespace. Por ejemplo, los siguientes
errores caen en esa categorías:

ORA-1653 unable to extend table … in tablespace …
ORA-1654 unable to extend index … in tablespace …

■ Máximo estents alcanzado

El numero de extents en table/index/temporary segment/undo segment/cluster/LOB/table partition/index partition igual al máximo de extents definido. Por ejemplo, los siguientes
errores caen en esa categorías:

ORA-1631 max # extents … reached in table …
ORA-1654 max # extents … reached in index …

■ Cuotas de espacio excedidas

La cuota del usuario, asignada en el tablespace, ha sido excedida. Por ejemplo, los siguientes errores caen en esas categorías:

ORA-1536 space quote exceeded for tablespace string

Habilitando y deshabilitando Resumable space allocation

Esto es posible cuando las sentencias son ejecutadas con un valor en el parámetro de inicialización RESUMABLE_TIMEOUT.

Por ejemplo, para habilitar resumable space allocation por 1 hora:

RESUMABLE_TIMEOUT = 3600

Si el parámetro es 0, entonces resumable space allocation es deshabilitado. Este es el default.

También puedes usar ALTER SYSTEM SET para cambiar el valor al parámetro a nivel del todo el sistema.

ALTER SYSTEM SET RESUMABLE_TIMEOUT=0;

A nivel de la sesión puedes habilitar o deshabilitar resumable space allocation.

ALTER SESSION ENABLE RESUMABLE;
ALTER SESSION DISABLE RESUMABLE;
ALTER SESSION ENABLE RESUMABLE TIMEOUT 3600;

Usando un LOGON trigger para definer el modo resumable

Otro método de definir el valor por defecto para el modo resumable, otro que el definir el parámetro de inicialización RESUMABLE_TIMEOUT, es registrar al nivel de la base de datos un Trigger LOGON para alterar la sesiones de los usuarios alterando resumable y definir el intervalo de tiempo.

Detectar sentencias suspendidas

Cuando una sentencia resumable es suspendida, el error no es disparado al cliente. En orden para una acción correctiva a ser tomada, la base de dato oracle provee métodos alternativos para notificar al usuario del error y proveer información acerca de las circunstancias.

Notificación al usuario: El evento AFTER SUSPEND y trigger

Cuando una sentencia resumable encuentra un error corregible, el sistema internamente genera el evento AFTER SUSPEND. Los usuarios pueden registrar triggers para este evento a nivel de la base de datos y del esquema. Si el usuario registra un trigger para manejar este evento del sistema, el trigger es ejecutado después de que la sentencia SQL ha sido suspendida.
En el siguiente ejemplo, el valor por defecto del intervalo de tiempo es cambiado por crear un trigger AFTER SUSPEND que llama a DBMS_RESUMABLE para definir el intervalo de tiempo a 3 horas.

CREATE OR REPLACE TRIGGER resumable_default_timeout
AFTER SUSPEND
ON DATABASE
BEGIN
DBMS_RESUMABLE.SET_TIMEOUT(10800);
END;

En el siguiente ejemplo, un trigger AFTER SUSPEND es creado y registrado como el usuario SYS a nivel de la base da dato. Cuando una sentencia resumable es suspendida en cualquier sesión, este trigger pude tener dos efectos:

■ Si un undo segment ha alcanzado su limite de espacio, entonces un mensaje es enviado al DBA y la sentencia es abortada.

■ Si cualquier otro error recuperable, el intervalo de tiempo es cambiado a 8 horas.

CREATE OR REPLACE TRIGGER resumable_default
AFTER SUSPEND
ON DATABASE
DECLARE
/* declare transaction in this trigger is autonomous */
/* this is not required because transactions within a trigger
are always autonomous */
PRAGMA AUTONOMOUS_TRANSACTION;
cur_sid NUMBER;
cur_inst NUMBER;
errno NUMBER;
err_type VARCHAR2;
object_owner VARCHAR2;
object_type VARCHAR2;
table_space_name VARCHAR2;
object_name VARCHAR2;
sub_object_name VARCHAR2;
error_txt VARCHAR2;
msg_body VARCHAR2;
ret_value BOOLEAN;
mail_conn UTL_SMTP.CONNECTION;
BEGIN
— Get session ID
SELECT DISTINCT(SID) INTO cur_SID FROM V$MYSTAT;
— Get instance number
cur_inst := userenv(‘instance’);
— Get space error information
ret_value :=
DBMS_RESUMABLE.SPACE_ERROR_INFO(err_type,object_type,object_owner,
table_space_name,object_name, sub_object_name);
/*
— If the error is related to undo segments, log error, send email
— to DBA, and abort the statement. Otherwise, set timeout to 8 hours.

— sys.rbs_error is a table which is to be
— created by a DBA manually and defined as
— (sql_text VARCHAR2(1000), error_msg VARCHAR2(4000),
— suspend_time DATE)
*/

IF OBJECT_TYPE = ‘UNDO SEGMENT’ THEN
/* LOG ERROR */
INSERT INTO sys.rbs_error (
SELECT SQL_TEXT, ERROR_MSG, SUSPEND_TIME
FROM DBMS_RESUMABLE
WHERE SESSION_ID = cur_sid AND INSTANCE_ID = cur_inst
);

SELECT ERROR_MSG INTO error_txt FROM DBMS_RESUMABLE
WHERE SESSION_ID = cur_sid and INSTANCE_ID = cur_inst;

— Send email to receipient via UTL_SMTP package
msg_body:=’Subject: Space Error Occurred
Space limit reached for undo segment ‘ || object_name ||
on ‘ || TO_CHAR(SYSDATE, ‘Month dd, YYYY, HH:MIam’) ||
‘. Error message was ‘ || error_txt;
mail_conn := UTL_SMTP.OPEN_CONNECTION(‘localhost’, 25);
UTL_SMTP.HELO(mail_conn, ‘localhost’);
UTL_SMTP.MAIL(mail_conn, ‘sender@localhost’);
UTL_SMTP.RCPT(mail_conn, ‘recipient@localhost’);
UTL_SMTP.DATA(mail_conn, msg_body);
UTL_SMTP.QUIT(mail_conn);
— Abort the statement
DBMS_RESUMABLE.ABORT(cur_sid);

ELSE
— Set timeout to 8 hours
DBMS_RESUMABLE.SET_TIMEOUT(28800);
END IF;
/* commit autonomous transaction */
COMMIT;
END;

septiembre 17, 2009 - Posted by | Database, Oracle

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: