24 septiembre 2009

Flashback en Oracle 9i (recuperar una tabla modificada y hecho el Commit)

Estimados Lectores,
les tengo un buen dato, supongamos que un usuario por error borró o modificó datos de una tabla y luego hizo "commit;"
¿cómo recuperar los datos anteriores?

Bueno, Oracle tiene una función llamada "Flashback", y si bien no es elemental su uso, es fácil de entender con el script que les voy a mostrar.

Supongamos que existe una tabla llamada "TABLA_ANTIGUA", y un usuario por error modificó los datos en la tabla con un "UPDATE" y puso "COMMIT;", o bien borró todos los datos haciendo un "DELETE FROM TABLA_ANTIGUA;"

El script que presento lo que hace es crear una tabla nueva, que llamaré "TABLA_NUEVA" con la misma estructura que "TABLA_ANTIGUA" y la vacía, luego hace un flashback y retrocede en el tiempo para llenar "TABLA_NUEVA" con los datos que tenía "TABLA_ANTIGUA", esto con el fin de poder corregir los cambios que sean necesarios y poder aplicar esto a "TABLA_ANTIGUA". ¿Se entiende?, bueno, será más fácil cuando hagan pruebas por ustedes mismos.

Recuerden que este script fué creado y probado en Oracle 9i

-- Creación de TABLA_NUEVA con la misma estructura de TABLA_ANTIGUA
CREATE TABLE TABLA_NUEVA AS SELECT * FROM TABLA_ANTIGUA;
-- Vaciado de TABLA_NUEVA para que quede sin datos
DELETE FROM TABLA_NUEVA;
COMMIT;

DECLARE
CURSOR C1 IS SELECT * FROM TABLA_ANTIGUA;
CUR_RECUPERA TABLA_ANTIGUA%ROWTYPE;
BEGIN
-- Aca defino el tiempo que quiero volver expresado en minutos (20 minutos)
DBMS_FLASHBACK.ENABLE_AT_TIME(SYSDATE - 20/1440);
OPEN C1; -- Abro el cursor con los datos de hace 20 minutos
DBMS_FLASHBACK.DISABLE;
LOOP
-- En este loop recorro el cursor e inserto los datos en TABLA_NUEVA
FETCH C1 INTO CUR_RECUPERA;
EXIT WHEN C1%NOTFOUND;
INSERT INTO TABLA_NUEVA VALUES CUR_RECUPERA;
END LOOP;
-- Verifico si el cursor aun esta abierto y lo cierro
IF C1%ISOPEN THEN
CLOSE C1;
END IF;
COMMIT;
END;

Algunas cosas que deben considerar:
- Para tablas muy grandes es mejor crear manualmente la tabla a mano, manteniendo la misma estructura de la tabla original, ya que como el script hace un CREATE TABLE AS... esto creará una tabla nueva llena de datos, lo cual puede tardar bastante en tablas grandes.

- Deben verificar el parámetro de la base de datos llamado UNDO_RETENTION, esto se hace de la siguiente manera en SQL*Plus
col name format a15
SELECT NAME, VALUE/60 MINUTES_RETAINED FROM V$PARAMETER WHERE NAME = 'undo_retention';

Este parámetro nos da el tiempo dentro del cual podemos hacer un flashback, o "cuanto" podemos retroceder en el tiempo.

bueno, mucha suerte, espero les sea de utilidad y que nunca tengan la necesidad de usarlo.

prueben de todas formas, así podram adaptarlo a vuestras necesidades.

9 comentarios:

Anónimo dijo...

Holla Jugadores de poker


Disfrute su website, No se si tu disfrutas de Poker, jo ha passado aqui para ayudes pero jo ha conseguido um bonus sin deposito de poker a http://www.espanol.pokersemdeposito.com/ para Poker 770 ahora lo problema es que jo no sé que jugar heads up o Double or Nothing?
abrazo
excusa mi horrible espanol!

Anónimo dijo...

Vous avez de bons points il, c'est pourquoi j'aime toujours verifier votre blog, Il semble que vous etes un expert dans ce domaine. maintenir le bon travail, Mon ami recommander votre blog.

Mon francais n'est pas tres bon, je suis de l'Allemagne.

Mon blog:
simulateur credit puis pret Rachat de Credit

Anónimo dijo...

By combining Pullups and Chin-ups in a single work out, the upper physique is place into
form.

Also visit my web page :: cheap bowflex selecttech 552 dumbbells

Anónimo dijo...

There are plenty of sophisticated HRM watches for the market place, primarily for significant runners.


Also visit my page Top

Anónimo dijo...

Bowflex claim to help make a lot of the finest treadmills for that value.


Take a look at my blog ... http://www.getfitnstrong.com/bowflex-dumbbells/reviewing-bowflex-selectt...

Anónimo dijo...

Dumbbells are developed to include resistance for your work out through gripping and
lifting with a single or both palms.

Also visit my website :: Click On this page

Anónimo dijo...

Many of the folks who use this in their property achieve this for energy exercising, leg
lifts or merely firming.

Take a look at my webpage ... 1 pound hand weights

Anónimo dijo...

To produce this physical exercise far more efficient at muscle creating it is best to reduce the burden or
resistance slower as opposed to pace you used to raise it.


Here is my web site; visit the following internet page

Anónimo dijo...

Muchas gracias por la información es de gran ayuda,aun no lo he púesto en marcha pero lo voy hacer en modo testing y te cuento. GRACIAS FRIEND.