Archivo

Entradas Etiquetadas ‘Recyclebin’

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

Martes, 29 de septiembre de 2009 Sin 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