Como recuperar una tabla si fue eliminada de la BD sin acudir a un datapump o rman
Aca una leve explicación de como se utilice el FLASHBACK para recuperar una tabla que “accidentalmente” se eliminó de la BD para NO tener que acudir a recuperar un respaldo completo de la BD, 1 o 2 TB por una mísera tabla si no tenemos un export o un datapump a mano.-
Bien creamos las tablas de pruebas (OJO, el ejemplo está realizado bajo el esquema PASO_NOV08 pero se que se puede hacer desde SYSTEM de igual modo)
SQL> create table TEST2 as select * from AAA_CLIENTES_DIRECCIONES;
Table created.
Validamos que la papelera de reciclaje no tenga datos.
SQL> show recyclebin
SQL>
Validamos cuantas tablas llamadas TEST hay:
SQL>
1 select owner, segment_name, segment_type, tablespace_name, bytes/1024/1024 mb
2 from dba_segments
3 where segment_type=’TABLE’ and owner=’PASO_NOV08′
4* and segment_name like ‘TEST%’OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME MB
—————————— ——————– —————— ——————– ———-
PASO_NOV08 TEST TABLE PASO_NOV08 2
PASO_NOV08 TEST2 TABLE PASO_NOV08 728
Ahora eliminamos la tabla, con un DROP TABLE.-
SQL> drop table TEST2;
Table dropped.
SQL> drop table test;
Table dropped.
Veamos que pasó con las tablas TEST del esquema de prueba…
SQL>
1 select owner, segment_name, segment_type, tablespace_name, bytes/1024/1024 mb
2* from dba_segments where segment_type=’TABLE’ and owner=’PASO_NOV08′ and segment_name like ‘TEST%’no rows selected
NO HAY TABLAS, en donde están? Hay que revisar la papelera de reciclaje de la BD para esto
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
—————- —————————— ———— ——————-
TEST BIN$dLiZjsuLgKLgQ6wQABSAog==$0 TABLE 2009-09-29:09:43:47
TEST2 BIN$dLiZjsuKgKLgQ6wQABSAog==$0 TABLE 2009-09-29:09:43:30
Los objetos ahora se encuentran bajo la papelera de reciclaje.-
SQL> select owner, object_name, type, original_name, droptime, can_undrop, can_purge from dba_recyclebin;
OWNER OBJECT_NAME TYPE ORIGINAL_NAME DROPTIME CAN CAN
———— —————————— ——– —————- ——————- — —
PASO_NOV08 BIN$dLiZjsuKgKLgQ6wQABSAog==$0 TABLE TEST2 2009-09-29:09:43:30 YES YES
PASO_NOV08 BIN$dLiZjsuLgKLgQ6wQABSAog==$0 TABLE TEST 2009-09-29:09:43:47 YES YES
Sin embargo, las tablas originales físicamente se encuentran bajo el tablespace de origen… Es decir cuando se eliminan las tablas, estás se cambian de nombre a “BIN$xxx” y lógicamente bajan a estar dentro de la papelera de reciclaje.
SQL>
1 select owner, segment_name, segment_type, tablespace_name, bytes/1024/1024 mb
2 from dba_segments
3 where segment_type=’TABLE’ and owner=’PASO_NOV08′
4* and segment_name in (select object_name from dba_recyclebin)OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME MB
———- —————————— —————— ——————– ———-
PASO_NOV08 BIN$dLiZjsuLgKLgQ6wQABSAog==$0 TABLE PASO_NOV08 2
PASO_NOV08 BIN$dLiZjsuKgKLgQ6wQABSAog==$0 TABLE PASO_NOV08 728
OK, pero como las recuperamos?…
SQL> flashback table TEST to before drop;
Flashback complete.
SQL> flashback table TEST2 to before drop;
Flashback complete.
SQL> show recyclebin
Una vez que se aplica el Flashback a la tabla, podemos recuperarla y listar su contenido o seguir trabajando sin problemas.-
SQL> select owner, segment_name, segment_type, tablespace_name, bytes/1024/1024 mb
2 from dba_segments
3 where segment_type=’TABLE’ and owner=’PASO_NOV08′
4 and segment_name like ‘TEST%’;OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME MB
———- —————————— —————— ——————– ———-
PASO_NOV08 TEST TABLE PASO_NOV08 2
PASO_NOV08 TEST2 TABLE PASO_NOV08 728
Bien, con lo anterior se puede recuperar la tabla, pero con el mismo nombre y si la tabla se creó de nuevo con datos que le sirven al negocio, pero necesito la tabla que se borró? Podemos recuperarla con otro nombre.
SQL> flashback table TEST2 to before drop rename to TEST3;
Flashback complete.
SQL> select owner, segment_name, segment_type, tablespace_name, bytes/1024/1024 mb
2 from dba_segments
3 where segment_type=’TABLE’ and owner=’PASO_NOV08′
4 and segment_name like ‘TEST%’;
OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME MB
———- —————————— —————— ——————– ———-
PASO_NOV08 TEST TABLE PASO_NOV08 2
PASO_NOV08 TEST3 TABLE PASO_NOV08 728
Pero que sucede si la tabla que se eliminó con la sentencia DROP realmente se quiere eliminar de la BD?
NOTA: Al hacer esto la papelera se libera y la tabla realmente se elimina.-
eviso la papelera, y sigue ahí, que hacer? Purgar la tabla para que se elimine definidamente, como hacer esto? De 2 manera:
1.- Al momento de hacer el drop se debe incluir la sentencia PURGE:
SQL> drop table TEST purge;
Table dropped.
Al revisar la papelera, ésta se encuentra vacía.-
SQL> show recyclebin
SQL>
2.- La tabla se elimina, de manera normal (DROP TABLE XXXXXX), y ahora vaciamos la tabla a purgar de la papelera de reciclaje:
SQL> select owner, segment_name, segment_type, tablespace_name, bytes/1024/1024 mb
2 from dba_segments
3 where segment_type=’TABLE’ and owner=’PASO_NOV08′
4 and segment_name like ‘TEST%’;OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME MB
———- —————————— —————— ——————– ———-
PASO_NOV08 TEST3 TABLE PASO_NOV08 728
SQL> drop table TEST3;
Table dropped.
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
—————- —————————— ———— ——————-
TEST3 BIN$dLiZjsuXgKLgQ6wQABSAog==$0 TABLE 2009-09-29:10:09:47SQL> purge table “BIN$dLiZjsuXgKLgQ6wQABSAog==$0″;
Table purged.
SQL> show recyclebin
Saludos









