Oracle Flashback Drop
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.
Contenido
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.