Fabuloso Flashback Fascinante | ExpoDBA

Fabuloso Flashback Fascinante

Fabuloso Flashback Fascinante

Muchachos y Muchachas, hoy nos estaremos dando una vuelta por el fabuloso mundo del FLASHBACK, una característica que comencé a conocer a partir de 10g y realmente es fascinante.

Para comenzar me gustaría decir, que el Flashback yo lo relaciono con la acción de rebobinar, así es, como cuando éramos chicos que rebobinábamos los casettes de música. Es decir, es ir a un punto del pasado, es recuperar una tabla borrada por error, es ver datos que ahora ya no existen, es MAGICO.

Bueno, comencemos a charlar más "técnicamente". Existen 4 tipos/maneras/casos de Flashback, los mismos son:

  • FLASHBACK QUERY
  • FLASHBACK DROP
  • FLASHBACK TABLE
  • FLASHBACK DATABASE

​Conozcámoslos por separado...


FLASHBACK QUERY

Dicha funcionalidad sirve para extraer el estado de una tabla en un cierto instante temporal anterior. Se puede usar para comparar las filas que una tabla tiene hoy con las que tenía ayer por ejemplo.

Vayamos a la práctica:

Supongamos que sabemos que se han borrado filas hace menos de una hora, entonces hacemos lo siguiente:

SELECT * FROM owner.tabla_ejemplo AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '60' MINUTE;

Dicha consulta nos traerá todas las filas que tenía la tabla_ejemplo hace una hora.

 

Les dejo otras opciones de consulta:

Flashback Versions Query

SELECT * FROM <tabla> VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;
SELECT * FROM <tabla> VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2004-10-26 11:37:01','YYYY-MM-DD HH:MI:SS') AND TO_TIMESTAMP('2004-10-26 11:43:01','YYYY-MM-DD HH:MI:SS')

Flashback Transaction Query

Para esto se necesita el privilegio FLASHBACK ANY TABLE.

SELECT * FROM FLASHBACK_TRANSACTION_QUERY WHERE START_TIMESTAMP >= TO_TIMESTAMP('2004-10-26 06:45:00','YYYY-MM-DD HH:MI:SS')

FLASHBACK DROP

En el caso de que se haya borrado una tabla (sin la cláusula PURGE), la misma es puesta en la Papelera de Reciclaje, por ende la podemos recuperar con alguna de las siguientes maneras:


FLASHBACK TABLE <nombre_tabla> TO BEFORE DROP;
FLASHBACK TABLE <recyclebin_name> TO BEFORE DROP RENAME TO <nombre_que_quiero>;

FLASHBACK TABLE

Este tipo de flashback nos permite rebobinar el estado de una tabla a un tiempo pasado. Se suele usar cuando un usuario actualiza una tabla con un valor equivocado en la cláusula WHERE. 

Para esto se necesitan tener los privilegios:

  • FLASHBACK TABLE
  • FLASHBACK ANY TABLE
  • SELECT, INSERT, DELETE y ALTER sobre la tabla en cuestión
  • La tabla en cuestión debe tener habilitado el ROW MOVEMENT
FLASHBACK TABLE <tabla> TO SCN xxxxxxx;

Tener en cuenta que esta operación deshabilita todos los triggers. Se puede usar la opción ENABLE TRIGGERS, que habilitará los triggers que estaban habilitados previo a la operación de flashback. 


FLASHBACK DATABASE

Esta funcionalidad permite rebobinar la base completa a un tiempo pasado. Esta característica de Oracle se basa en los registros de los Flashback Logs que son logs similares a los Redo Logs. Se debe tener en cuenta que sólo vuelve para atrás a los datafiles, no involucra al control file, password file, etc.

Existen 2 modos de uso de esta característica:

Flashback Login

Esta opción permite volver a cualquier punto del tiempo desde el momento en que se habilitó. El período debe ser menor al valor definido en el parámetro DB_FLASHBACK_RETENTION_TARGET (en minutos) y la FRA debe tener el suficiente espacio para almacenar todos los Flashback Logs del período, de lo contrario Oracle depurará los logs y habrá momentos a los cuales no se podrá volver.

Puntos de Restore Garantizados (GRP)

Esta opción se usa cuando se quiere volver a un punto específico del tiempo, es decir, al momento en el cual se creó el punto de restore, ni antes, ni después. Con lo cual esto genera menos Flashback Logs.

 

Pre-Requisitos

  • La base debe encontrarse en modo ARCHIVELOG.
  • La base debe tener activada la FRA.
  • La base debe encontrarse en modo FLASHBACK ON.
  • Debemos contar con espacio suficiente para los flashback logs. 

 

Mejores Prácticas

  • Configurar el DB_FLASHBACK_RETENTION_TARGET como mínimo de 60 minutos. El valor elegido debe ser el mismo en la primaria y la secundaria.
  • En bases con una SGA mayor a 4GB es conveniente configurar el parámetro LOG_BUFFER en un valor entre 32 y 64 MB.
  • Configurar la alerta Recovery Area Free Space (%) del Enterprise Manager.
  • Para ver el progreso del FLASHBACK DATABASE se puede consultar la vista V$SESSION_LONGOPS (select * from v$session_longops where opname like 'Flashback%').
  • ¿Cómo calcular el tamaño de la FRA?, recomiendo leer la Nota 565535.1 de My Oracle Support (ex-Metalink).
  • ¿Cómo habilitar el Flashback en RAC?, recomiendo leer la Nota 416496.1 de My Oracle Support (ex-Metalink). 

Desventajas

  • 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.
  • Existen ciertas operaciones que no se pueden volver atrás, como ser: Datafile Shrink / Drop TablespaceDrop Datafile

En 11gR2 estas son las limitaciones:

  • Las sentencias DDLs que alteren la estructura de una tabla (drop/modify column, move table, drop partition, truncate table/partition, and add constraint) invalidan los datos existentes del undo para esa tabla. Si se trata de rebobinar la base a un tiempo anterior a esa sentencia DDL, aparecerá el error ORA-01466. las sentencias DDL que alteren los atributos de almacenamiento de una tabla (pctfree, initrans, and maxtrans) no invalidan los datos de undo.
  • No permite reparar fallas fisicas o recuperarse de un borrado accidental de algun datafile.
  • No se puede deshacer una operacion de shrink. pero se puede poner el archivo shrinkeado offline, hacer el flashback del resto de la base y luego restorear y recuperar el archivo shrinkeado con RMAN.
  • Si uno restorea o re-crea un controlfile, todos los flashback logs acumulados son descartados. es decir, no se puede usar el flashback database para recuperar a un punto del tiempo anterior al restore o re-creacion del control file.
  • Si se utilizan operaciones en modo nologging y se quiere rebobinar puede pasar que nos encontremos con un bloque corrupto.

Basta de teoría y ahora pasemos a lo más lindo... la práctica:

 

Flashback Login:

Habilitar Flashback:

Primeros habilitamos el Flashback, si bien a partir de 11gR2 se puede habilitar sin necesidad de reiniciar la instancia, aquí menciono los pasos que sirven para las versiones anteriores:

SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT
SQL> ALTER DATABASE FLASHBACK ON;
SQL> ALTER DATABASE OPEN;
SQL> SELECT FLASHBACK_ON FROM V$DATABASE;

Deshabilitar Flashback:

SQL> ALTER DATABASE FLASHBACK OFF;
SQL> SELECT FLASHBACK_ON FROM V$DATABASE;

 

Puntos de Restore Garantizados (GRP):

1. Detectamos el número de SCN al cual querramos volver en un futuro:

SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT

2. Creamos el punto de restore:

SQL> CREATE RESTORE POINT <nombre_proceso>_<SCN> GUARANTEE FLASHBACK DATABASE;

3. Consultamos que se haya creado el punto de restore correctamente:

SQL> SELECT * from V$RESTORE_POINT WHERE guarantee_flashback_database = 'YES';
SQL> ALTER DATABASE OPEN;

4. Una vez que haya pasado el tiempo y se quiera volver al punto de restore creado en el punto 2, reiniciamos la instancia y volvemos al pasado. Esto llevará un tiempo, ser paciente:

SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT
SQL> FLASHBACK DATABASE TO RESTORE POINT <nombre_proceso>_<SCN>;
SQL> ALTER DATABASE OPEN READ ONLY;
SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;

5. Abrimos la base con la opción RESETLOGS:

SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP MOUNT
SQL> ALTER DATABASE OPEN RESETLOGS;

6. Por último se puede eliminar el punto de restore creado. Esto eliminará todos los flashback logs que corresponden al mismo, liberando el espacio ocupado.

SQL> DROP RESTORE POINT <nombre_proceso>_<SCN>;

Espero que les guste y les sirva en algún momento de sus vidas...

 

Eso es todo. Saludos.

Facundo E. Grande

Lanús - Buenos Aires - Argentina


PROVERBIO: "Procura que tu palabra supere al silencio"