Revisamos brevemente en este post la funcionalidad flashback query que aporta el gestor de BBDD de Oracle desde su versión 9i.
Básicamente se trata de un tipo de sql de Oracle que accede a datos que existían en la base de datos en un momento anterior, pero que en el momento en el que se ejecuta la sql pueden no existir o haber sufrido modificaciones. Para ello, Oracle utiliza los datos que quedan disponibles durante un tiempo en el segmento de UNDO. Este segmento, como es sabido, almacena los datos anteriores a una serie de modificaciones. Se utiliza para asegurar la consistencia en la lectura de una consulta previa a la confirmación de las modificaciones (commit) y pueden ser utilizados en una posible recuperación (rollback).
La sentencia de Oracle SQL flashback query nos permite ver datos de la tabla que han sido borrados o modificados. Ejecutando una flashback query accedemos a datos de una foto de datos consistentes en un punto determinado, especificando para ello la hora del sistema o bien el número de cambio del sistema (SCN). La base de datos debe estar configurada para trabajar en Automatic Undo Management (AUM). Para ello revisar los siguientes parámetros de la base de datos Oracle:
undo_management = auto undo_tablespace = UNDOTBS001 (tablespace que alberga el segmento de undo) undo_retention = 3600 (tiempo en segundos que tenemos retenido el dato en el segmento de undo)
Hay que tener en cuenta respecto al parámetro undo_retention que si el tablespace de UNDO no es lo suficientemente grande como para mantener ese tiempo todas las transacciones, el gestor de base de datos las va a sobreescribir. Igualmente, considerar que para poder ejecutar el comando flashback query de Oracle SQL debemos tener permisos sobre el package BDMS_FLASHBACK. Para ello:
sys> grant execute on dbms_flashback to usuario1;
Veamos un ejemplo. Supongamos que queremos realizar una consulta SQL sobre una tabla que contiene facturas de clientes y queremos acceder a los datos de un cliente que previamente hemos borrado:
sys> select to char(sysdate, ‘dd-mm-yyyy hh24:mi’) fecha_sistema from dual; fecha_sistema ------------------------- 12-09-2011 12:05 sys> delete from t_facturas where cod_cliente = ‘00125’; 4 registros borrados sys> commit;
Media hora después ejecutamos:
sys> select to char (sysdate, ‘dd-mm-yyyy hh24:mi’) fecha_sistema from dual fecha_sistema ------------------------- 12-09-2011 12:35 sys> exec dbms_flashback.enable_at_time (to_date('12-09-2011 12:05, 'DD-MM-YYYY HH24:MI')); sys> select to char (sysdate, ‘dd-mm-yyyy hh24:mi’) fecha_sistema from dual fecha_sistema ------------------------- 12-09-2011 12:35 sys> exec dbms_flashback.enable_at_time (to_date(’12-09-2011 12:05, ‘DD-MM-YYYY HH24:MI’)); Procedimiento PL/SQL terminado correctamente. sys> select * from t_facturas where cod_cliente = ‘00125’; …… …… …… …… 4 registros seleccionados. sys> execute dbms_flasback.disable; sys> select count(*) from t_facturas where cod_cliente = ‘00125’; count(*) ------ 0
Se puede obtener lo mismo accediendo por el número de cambio SCN:
sys> select dbms_flashback.get_system_change_number from dual; GET_SYSTEM_CHANGE_NUMBER ------------------------ 1307125 sys> exec dbms_flashback.enable_at_system_change_number(1307125); Procedimiento PL/SQL terminado correctamente
Existe también la posibilidad de emplear la sentencia ‘select ... as of...’:
sys> select * from t_facturas where cod_cliente = ‘00125’ as of timestamp to_timestamp (’12-09-2011 12:05', ‘DD-MM-YYYY HH24:MI’); sys> select * from t_facturas where cod_cliente = ‘00125’ as of scn 1307125;
Hay que tener en cuenta que mientras la sesión está en el modo Flashback Query, solo podemos ejecutar sentencias SELECT. Las sentencias SQL de actualización (insert, delete y update) no están permitidas.
En el trabajo diario con esta opción es útil el uso de tablas temporales para trabajar con los datos recuperados:
sys> create table t_facturas_ant as (select * from t_facturas where cod_cliente = ‘00125’ as of timestamp to_timestamp (’12-09-2011 12:05, ‘DD-MM-YYYY HH24:MI’);
Otras opciones Flashback Query
A continuación listamos algunas funcionalidades que aporta Oracle relacionadas con operaciones Flashback Query:
- Flashback Version Query: Acceso al histórico de cambios de una tabla.
- Flashback Transaction Query: Acceso al histórico de cambios de una transacción determinada.
- Flashback Table: Acceso a datos anteriores, pero para una única tabla.
- Flashback Drop: Recuperar una tabla borrada (‘papelera reciclaje’).
- Flashback Database: Permite dejar la BBDD tal y como se encontraba en un tiempo pasado. Similar a restaurar un backup, pero con las limitaciones temporales de los procesos flashback, aunque mucho más rápido que recuperar la copia del backup. Es necesario tener el modo flashback activado, así como la flash recovery area.
Algunas de estas opciones requieren que el gestor sea 'Enterprise Edition'.
Se trata, como se ha dicho, de una sentencia de Oracle SQL bastante útil, con múltiples opciones de “rebobinado” y que nos puede sacar de más de un apuro.