Oracle Flashback Drop

De Dos Ideas.
Revisión del 18:10 26 ago 2009 de Admin (discusión | contribuciones)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

El FLASHBACK DROP revierte el efecto de la sentencia DROP TABLE. Tambien es una funcionalidad existente a partir de [Oracle10g].

La funcionalidad de FLASHBACK DROP está construida sobre el mecanismo llamado Recycle Bin, que a partir de 10g, Oracle usa para administrar objetos borrados de la base de datos hasta que el espacio que ocupan sea necesitado para almacenar nuevos datos o los mismos sean purgados manualmente.

Recycle Bin

El Recycle Bin es un container virtual donde residen todos los objetos borrados. Los objetos borrados siguen ocupando el mismo espacio que al momento de ser borrados, solo que no aparecen en el listado de objetos disponibles.

De esta manera si la tabla EMP fue creada en el tablespace USERS, cuando borro la tabla, esta permanece en el tablespace USERS ocupando el mismo espacio.

Las tablas borradas y cualquiera de sus objetos asociados, como índices, constraints, nested tables, y otros objetos dependientes no son movidos, sino que simplemente son renombrados con la forma BIN$globalUID$version.

Se puede consultar el contenido del Recycle Bin con el comando SHOW RECYCLEBIN o consultando la siguiente vista:

scott@LAB10G> desc recyclebin
Nombre                   Nulo?   Tipo
----------------------- -------- ----------------
OBJECT_NAME             NOT NULL VARCHAR2(30)
ORIGINAL_NAME                    VARCHAR2(32)
OPERATION                        VARCHAR2(9)
TYPE                             VARCHAR2(25)
TS_NAME                          VARCHAR2(30)
CREATETIME                       VARCHAR2(19)
DROPTIME                         VARCHAR2(19)
DROPSCN                          NUMBER
PARTITION_NAME                   VARCHAR2(32)
CAN_UNDROP                       VARCHAR2(3)
CAN_PURGE                        VARCHAR2(3)
RELATED                 NOT NULL NUMBER
BASE_OBJECT             NOT NULL NUMBER
PURGE_OBJECT            NOT NULL NUMBER
SPACE                            NUMBER

Podemos seguir consultando los objetos borrados usando el nombre asignado automáticamente por Oracle. Cada usuario tiene los mismos privilegios sobre los objetos del Recycle Bin que tenían antes de que fueran borrados.

Los objetos permanecerán en el Recycle Bin hasta que el dueño del objeto decda removerlo permanentemente usando el nuevo comando PURGE o cuando la necesidad de espacio lo reclame. Las necesidades de espacio pueden ser, cuando el usuario supera su cuota dentro del tablespace o cuando el tablespace se llena. Ante cualquiera de estos 2 eventos, Oracle eliminará automáticamente los objetos más antiguos del Recycle Bin hasta que logre el espacio solicitado que necesita.

Podemos purgar manualmente el Recycle Bin con los siguientes comandos:

PURGE TABLE <tabla>;
PURGE INDEX <índice>;
PURGE RECYCLEBIN;
PURGE TABLESPACE <tablespace> [USER <usuario>];


El purgado se puede hacer tambien en el momento del DROP del objeto con la siguiente cláusula;

DROP TABLE <tabla> PURGE;

Por default el Recycle Bin está habilitado pero se puede deshabilitar mediante el parámetro de configuración RECYCLEBIN=[ON|OFF] ya sea para todo el sistema o solo para la sesión.


Flashback Drop

Mediante el comando FLASHBACK DROP podemos recuperar las tablas que residen en el Recycle Bin.

FLASHBACK TABLE <tabla>  TO BEFORE DROP [RENAME TO <nuevo nombre tabla>] ;

Ejemplo

Creación de Tabla Ejemplo

scott@LAB10G> CREATE TABLE emp_flash AS SELECT * FROM emp WHERE empno < 7700;
Tabla creada.
scott@LAB10G> SELECT COUNT(1) FROM emp_flash;
  COUNT(1)
----------
         6
scott@LAB10G> ALTER TABLE emp_flash ADD CONSTRAINT emp_flash_pk
  2  PRIMARY KEY (EMPNO);
Tabla modificada.
scott@LAB10G> CREATE OR REPLACE TRIGGER emp_flash_trg
 2    BEFORE INSERT OR UPDATE OR DELETE ON emp_flash
 3  BEGIN
 4    DBMS_OUTPUT.PUT_LINE('Esto es un trigger');
 5  END emp_flash_trg;
 6  /
Disparador creado.
scott@LAB10G> SELECT object_name, object_type
 2* FROM user_objects WHERE object_name like 'EMP_FLASH%'
OBJECT_NAME      TYPE
---------------- ----------
EMP_FLASH        TABLE
EMP_FLASH_PK     INDEX
EMP_FLASH_TRG    TRIGGER

Creamos la tabla EMP_FLASH con objetos asociados (una PK y un trigger) para ver que sucede al realizar el DROP y el FLASHBACK de la tabla.


Borrado e Investigación de Recycle Bin

scott@LAB10G> DROP TABLE emp_flash;
Tabla borrada.
scott@LAB10G> SHOW RECYCLEBIN;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE
---------------- ------------------------------ ------------
DROP TIME
-------------------
EMP_FLASH        BIN$sOdkxF+YR8C+UxoQnqCdPQ==$0 TABLE
2007-08-30:15:59:29
scott@LAB10G> SELECT object_name, original_name, type FROM recyclebin;
OBJECT_NAME                    ORIGINAL_NAME   TYPE
------------------------------ --------------- ----------
BIN$w0Kbu7YCT+itQjl0RD9PCQ==$0 EMP_FLASH_TRG   TRIGGER
BIN$sOdkxF+YR8C+UxoQnqCdPQ==$0 EMP_FLASH       TABLE
BIN$yfqwjE40Q+ueUv019AJaSA==$0 EMP_FLASH_PK    INDEX

Observamos que cuando ejecuto el comando SHOW RECYCLEBIN solo veo el objeto “padre” y no los objetos asociados. Para ver todos los objetos borrados debo consultar la vista RECYCLEBIN.

Recupero con Flashback DROP

scott@LAB10G> FLASHBACK TABLE emp_flash TO BEFORE DROP;
Flashback terminado.
scott@LAB10G> SHOW RECYCLEBIN;
scott@LAB10G> SELECT object_name, original_name, type FROM recyclebin;
ninguna fila seleccionada
scott@LAB10G> SELECT count(1) FROM emp_flash;
  COUNT(1)
----------
        6
scott@LAB10G> SELECT object_name, object_type
 2  FROM user_objects WHERE object_name like 'EMP_FLASH%';
OBJECT_NAME                    TYPE
------------------------------ ----------
EMP_FLASH                      TABLE
scott@LAB10G> SELECT index_name, index_type
 2*  FROM user_indexes WHERE table_name = 'EMP_FLASH';
INDEX_NAME                     INDEX_TYPE
------------------------------ ---------------------------
BIN$yfqwjE40Q+ueUv019AJaSA==$0 NORMAL
scott@LAB10G> SELECT name, type
 2*  FROM user_dependencies WHERE referenced_name = 'EMP_FLASH';
NAME                           TYPE
------------------------------ ----------
BIN$w0Kbu7YCT+itQjl0RD9PCQ==$0 TRIGGER
scott@LAB10G> ALTER INDEX "BIN$yfqwjE40Q+ueUv019AJaSA==$0" RENAME TO emp_flash_pk;
Indice modificado.
scott@LAB10G> ALTER TRIGGER "BIN$w0Kbu7YCT+itQjl0RD9PCQ==$0" RENAME TO emp_flash_trg;
Disparador modificado.
scott@LAB10G> ALTER TRIGGER emp_flash_trg COMPILE;
Disparador modificado.
scott@LAB10G> SELECT object_name, object_type
  2  FROM user_objects WHERE object_name like 'EMP_FLASH%';
OBJECT_NAME                    TYPE
------------------------------ ----------
EMP_FLASH                      TABLE
EMP_FLASH_PK                   INDEX
EMP_FLASH_TRG                  TRIGGER

Cuando una tabla es recuperada desde el Recycle Bin, se restaura la tabla y se renombra automáticamente con su nombre original.

Los objetos asociados como los índices, constraints o triggers también son restaurados, pero sus nombres originales no se recuperan, lo que significa que siguen siendo de la forma BIN$.

Una vez que finalizamos la operación de FLASHBACK no hay manera de averiguar los nombres originales de estos objetos. Por lo tanto siempre es buena idea consultarlos antes de realizar el recupero, entonces luego del FLASHBACK DROP de la tabla podemos hacer un RENAME de los objetos asociados a su nombre original.


Más de una versión en Recycle Bin

scott@LAB10G> DROP TABLE emp_flash;
Tabla borrada.
scott@LAB10G> CREATE TABLE emp_flash AS (select * from emp where empno > 7700);
Tabla creada.
scott@LAB10G> DROP TABLE emp_flash;
Tabla borrada.
scott@LAB10G> SHOW RECYCLEBIN;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE
---------------- ------------------------------ ------------
DROP TIME
-------------------
EMP_FLASH        BIN$4PK0jfk4R1uFiZLIQ7HHIg==$0 TABLE
2007-08-30:16:55:41
EMP_FLASH        BIN$C+EJy7/qThipip4yLQM8fQ==$0 TABLE
2007-08-30:16:54:59
scott@LAB10G> SELECT object_name, original_name, type, droptime, base_object FROM RECYCLEBIN;
OBJECT_NAME                    ORIGINAL_NAME   TYPE
------------------------------ --------------- ----------
DROPTIME            BASE_OBJECT
------------------- -----------
BIN$4PK0jfk4R1uFiZLIQ7HHIg==$0 EMP_FLASH       TABLE
2007-08-30:16:55:41       53938
BIN$PyLtYlEpTPOUVUDbW/vTrQ==$0 EMP_FLASH_PK    INDEX
2007-08-30:16:54:59       53934
BIN$DTlnXxLtQ0u5d4XPW9auZQ==$0 EMP_FLASH_TRG   TRIGGER
2007-08-30:16:54:59       53934
BIN$C+EJy7/qThipip4yLQM8fQ==$0 EMP_FLASH       TABLE
2007-08-30:16:54:59       53934
scott@LAB10G> FLASHBACK TABLE "BIN$C+EJy7/qThipip4yLQM8fQ==$0" TO BEFORE DROP RENAME TO emp_flash_v1;
Flashback terminado.
scott@LAB10G> FLASHBACK TABLE "BIN$4PK0jfk4R1uFiZLIQ7HHIg==$0" TO BEFORE DROP RENAME TO emp_flash_v2;
Flashback terminado.

Para recuperar desde el Recycle Bin cuando hay mas de una versión de la tabla, debemos usar el nombre generado por Oracle.

Si no usamos este nombre (BIN$) la sentencia FLASHBACK DROP recuperará a su nombre original la última versión existente en el Recycle Bin.

Ver también