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. (Podes Mirar Acá como hacer esta tarea)
- 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.
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 gustaMe gusta
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 gustaMe gusta