martes, 19 de junio de 2012

Como Flashback Drop me salvo mucho trabajo

Peoplesoft tiene una peculiaridad que no me gusto mucho, una de las maneras que tienen para modificar la estructura de una tabla es que crea una tabla con un nombre temporal,  de ahí hace un insert into de un select , y de aquí lo que hace es tira la tabla original y renombra la tabla temporal al nombre de la tabla original.

Antes de hacer todo esto es altamente recomendable tener un buen respaldo de tu base de datos, si es una tabla pequeña , con un export puede bastar, pero si es una tabla bastante grande un export puede ser tardado y un poco latoso.

El otro día tuve que estar al pendiente de unos cambios hechos de esta manera, como eran pocas tablas con un tamaño relativamente chico de 10 millones de entradas cada una , así que me asegure que el respaldo de la base de datos fuera consistente y también para mi salud mental, tome un export, aunque me tome un poco de espacio y tiempo, quería que cualquier cosa poder recuperar rápido y sin tener que recuperar toda la base de datos, cabe decir que eran catálogos, así que el equipo funcional y yo sabíamos que los datos no iban a cambiar mientras los exportabamos.

Antes de empezar , me asegure que el recyclebin estuviera prendido

TESTDB> show parameter recyclebin

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on

Al correr uno de los scripts, la Ley de Murphy entro en accion, este trono a la mitad por que uno de los cambios estructurales que se estaba haciendo era pasar un campo a que tuviera la restricción de NOT NULL, pero el script continua aunque haya fallado ahí, así que tiro la tabla original , y renombro la tabla con nombre temporal al que tenia la original, quedandos con una tabla vacía, como se ve abajo :

TESTDB> create table temporal(id number,name varchar2(30) not null);
Table created.

TESTDB> insert into temporal (id,name) select id,name from test;
insert into temporal (id,name) select id,name from test
                                              *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("RENE"."TEMPORAL"."NAME")

TESTDB> drop table TEST;
Table dropped.

TESTDB> rename TEMPORAL to TEST;
Table renamed.

TESTDB> select count(1) from TEST;
 
 COUNT(1)

----------
       
  0

En lugar de ponerme a restaurar la tabla del respaldo que habia tomado antes de empezar, lo unico que tuve que hacer es identificar en el recyclebin la tabla que habia tirado, tirar la tabla que se habia renombrado de TEMPORAL a TEST en el script anterior, ya que esta era la  tabla sin datos y de ahi hacer un flashback before drop para que TEST volviera a tener los datos antes del comando DROP

TESTDB>  SELECT object_name,original_name,droptime  
2  FROM recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    DROPTIME
------------------------------ -------------------------------- -------------------
BIN$wtQeQ7eoQJ7gQAAAAAAbEQ==$0 TEST_IDX                         2012-06-19:06:27:01
BIN$wtQeQ7epQJ7gQAAAAAAbEQ==$0 TEST                             2012-06-19:06:27:01


TESTDB> drop table TEST;

Table dropped.

TESTDB> FLASHBACK TABLE "BIN$wtQeQ7epQJ7gQAAAAAAbEQ==$0" TO BEFORE DROP;

Flashback complete.

TESTDB> select count(1) from TEST;

  COUNT(1)
----------
         3

En versiones anteriores a 11.2.0.2 si mal no recuerdo, todavia si existia un indice de la tabla , tambien tenias que sacarlo del recyclebin, y es tan facil como renombrar al indice, en 11.2.0.2, los indices se recuperan con el flashback.

Esta tecnica es muy buena para cuando haz hecho un drop de una tabla y rapidamente necesitas recuperarla, espero te ayude como a mi lo ha hecho en ciertas ocasiones.