FLASHBACK – Restore Point
Vamos a presentar algunas carateristicas del flashback en el motor de la base de Datos y este abrira una serie de articulos relativos a este tema.
- Realizar consultas que devuelven últimos datos.
- Realizar consultas que los metadatos de retorno que muestra una historia detallada de cambios en la base de datos.
- Recuperar tablas o filas a un punto anterior en el tiempo.
- Seguimiento automático de cambios y el archivo de datos transaccionales.
- Deshacer una transacción y sus dependientes, mientras que las transacciones de la base de datos permanece en línea.
Algunas desventajas que podemos objetar :
- No se puede usar Flashback como medio de recuperación en el caso de que la corrupción de la base de datos se da a nivel físico.
- Es un producto pensado para volver atrás cambios no deseados realizados en un pasado cercano. Cuanto tiempo atrás uno puede ir, es configurable, pero limitado según la cantidad de transacciones que se realicen en la base y el espacio disponible para guardar las transacciones realizadas.
Prerequisitos
- La base debe encontrarse en modo ARCHIVELOG.
- La base debe encontrarse en modo FLASHBACK ON.
- Debemos contar con espacio suficiente para los flashback logs.
La sintaxis es sencilla:
FLASHBACK DATABASE TO {SCN | TIMESTAMP [expr] | RESTORE POINT}
Lo que primero debemos hacer es chequear el numero de SCN que posee la base al momento de decidir a que punto en el tiempo vamos a retornar.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
15626203412
Una vez que conocemos el punto a donde retornaremos (pont-in-time) , creamos un restore point.
A mi me gusta definir los nombres del restore point , con un nombre que identifique al proceso que estamos por correr, mas el SCN obtenido con la query anterior.
Ahora bien , vemos un ejemplo de como crear un restore point
SQL> create restore point ACTUALIZA_VOLUMENES_15626203412;
Restore point created.
Ahora consultamos la vista v$restore_point, donde debe apararecer nuestro restore point generado.
SQL> col scn format 999999999999 head 'Scn' justify c
SQL> col NAME format a40
SQL> col TIME format a60
SQL> set line 150
SQL> select
name,
scn,
time,
database_incarnation#,
guarantee_flashback_database,
storage_size
from v$restore_point
2 3 4 5 6 7 8 9 ;
NAME Scn TIME DATABASE_INCARNATION# GUA STORAGE_SIZE
------------------------------- ------------- --------------------------------- --------------------- --- ------------
ACTUALIZA_VOLUMENES_15626203412 15626203412 14-MAR-11 01.10.12.000000000 PM 8 NO 0
Ahora es donde podemos dar el visto bueno al personal que quiere correr sus procesos o la aplicacion que introducira modificaciones en la base.
Como no puedo poner un proceso online que lo demuestre :D , pongo un ejemplo de como funciona esto.
Con el restore point ya creado voy a crear un objeto llamado ACTUALIZA_VOLUMENES.
SQL> create table ACTUALIZA_VOLUMENES ( a number );
Table created.
SQL> insert into ACTUALIZA_VOLUMENES values (1);
1 row created.
SQL> commit;
Commit complete.
Ahora con mi tabla creada , voy a regresar la base de datos al pont-in-time por medio de flashback.
Primero debemos bajar la base y montarla.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 536870912 bytes
Fixed Size 2085288 bytes
Variable Size 268439128 bytes
Database Buffers 260046848 bytes
Redo Buffers 6299648 bytes
Database mounted.
Ahora con el SCN que marcamos , vamos a retornar a un punto en el tiempo.
SQL> flashback database to restore point ACTUALIZA_VOLUMENES_15626203412;
Flashback complete.
Abrimos la base poniendola en modo open.
SQL> alter database open resetlogs;
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
Database altered.
Verificamos con el SCN que hayamos retornado adecuadamente.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
15626203412
Ahora despues de retornar , vamos a verificar si nuestro objeto sigue :
SQL> desc ACTUALIZA_VOLUMENES
ERROR:
ORA-04043: object ACTUALIZA_VOLUMENES does not exist
Y podemos ver que que la tabla no se encuentra más.
Como dropeamos el restore point si no lo utilizamos mas ?
SQL> drop restore point ACTUALIZA_VOLUMENES_15626203412;"
Restore point dropped.
Comentarios
Publicar un comentario