Inicio > Bases de Datos, Oracle > Como recuperar una tabla si fue eliminada de la BD sin acudir a un datapump o rman

Como recuperar una tabla si fue eliminada de la BD sin acudir a un datapump o rman

Martes, 29 de septiembre de 2009 Dejar un comentario Ir a comentarios

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
S
QL>

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:47 

SQL> purge table “BIN$dLiZjsuXgKLgQ6wQABSAog==$0”; 

Table purged. 

SQL> show recyclebin

 

 Saludos

  1. Sin comentarios aún.
  1. Sin trackbacks aún.