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

  1. La base debe encontrarse en modo ARCHIVELOG.
  2. La base debe encontrarse en modo FLASHBACK ON. (Podes Mirar Acá como hacer esta tarea)
  3. 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 😀 , 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.

3 respuestas a “FLASHBACK – Restore Point

  1. Hola Juan Andrés,

    Tengo una consulta que quizás pueda servir para enriquecer este artículo.

    Imaginemos este escenario: Luego de habilitar el flashback, supongamos que la gente realiza pruebas, una de ellas es reiniciar la instancia y luego seguir haciendo pruebas.

    Entonces la pregunta es, ¿Se puede volver al punto de restore sin ningún problema? A pesar de que luego de habilitar el flashback y crear el punto de restore se reinició la instancia.

    Muchas gracias.

    Facundo de Valentín Alsina (Lanús)

    Me gusta

    1. Facundo,
      Primero ante todo gracias por interesarte y postear tu duda.
      Se puede retornar en un punto en el tiempo luego de haber puesto la base en modo flashback, haber creado un restore point , y reiniciado la instancia luego de pruebas, por que cuando vos creas el restore point eso se guarda en un tabla y luego retornamos a un determinado punto en el tiempo con un numero de referencia. Esto es posible por que las transacciones realizadas en la base se guardan en los flkashback logs . Cuando reinicias la instancia o la base de datos el restore point persistira, lo que si debes tener muy en cuenta, y que es de vital importancia, que no te quedes sin espacio para los flashback logs, por que al querer retornar usa un mecanismo parecido al recover database y si no tenes las piezas por que comienzan a pisarse entre ellas cuando no hay espacio , no podes retornar a los cambios a la marca que pusiste.
      Espero haber aclarado tu punto de vista y me obliga a tener que escribir un articulo sobre ello.
      Te invito a que te suscribas al blog que en el pie del mismo se encuentra y te enviara un mail con cada nota que publico.
      Saludos,
      Juan Andres.

      Me gusta

Los comentarios están cerrados.