Oracle Flashback Query

Revisem breument en aquest post la funcionalitat flashback query que aporta el gestor de BBDD d'Oracle des de la seva versió 9i.

Bàsicament es tracta d'un tipus de sql que accedeix a dades que existien a la base de dades en un moment anterior, però que en el moment en què s'executa la sql poden no existir o haver patit modificacions. Per això, Oracle utilitza les dades que queden disponibles durant un temps en el segment de UNDO. Aquest segment, com és sabut, emmagatzema les dades anteriors a una sèrie de modificacions. S'utilitza per assegurar la consistència en la lectura d'una consulta prèvia a la confirmació de les modificacions (commit) i poden ser utilitzats en una possible recuperació (rollback).

Gràfic execució flashback query d'Oracle

La sentència flashback query ens permet veure dades de la taula que han estat esborrats o modificats.Executant una flashback query accedim a dades d'una foto de dades consistents en un punt determinat, especificant per a això l'hora del sistema o bé el nombre de canvi del sistema (SCN). La base de dades ha d'estar configurada per treballar en Automatic Undo Management (AUM). Per a això revisar els següents paràmetres:
undo_management = auto
undo_tablespace = UNDOTBS001 (tablespace que alberga el segment de undo)
undo_retention = 3600 (temps en segons que tenim retingut la dada en el segment de undo)
Cal tenir en compte respecte al paràmetre undo_retention que si el tablespace de UNDO no és prou gran com per mantenir aquest temps totes les transaccions, el gestor de base de dades les va a sobreescriure.Igualment, considerar que per poder executar la comanda flashback query hem de tenir permisos sobre el package BDMS_FLASHBACK. Per a això:

sys> grant execute on dbms_flashback to usuari1;

Vegem un exemple. Suposem que volem realitzar una consulta sobre una taula que conté factures de clents i volem accedir a les dades d'un client que prèviament hem esborrat:

sys> select to char (sysdate, 'dd-mm-yyyy hh24: el meu') fecha_sistema from dual;

fecha_sistema
-------------------------
12-09-2011 12:05
sys> delete from t_facturas where cod_cliente = '00125 ';
4 registres esborrats
sys> commit;

  

Mitja hora després executem:

sys> select to char (sysdate, 'dd-mm-yyyy hh24: el meu') 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: el meu') 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'));

Procediment PL / SQL acabat correctament.

sys> select * from t_facturas where cod_cliente = '00125 ';

... ...

... ...

... ...

... & Hellip;

4 registres seleccionats.

sys> execute dbms_flasback.disable;

sys> select count (*) from t_facturas where cod_cliente = '00125 ';

count (*)

------

0

Es pot obtenir el mateix accedint pel nombre de canvi 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);

Procediment PL / SQL acabat correctament

 

Existeix també la possibilitat d'utilitzar la sentència 'select ...es of ... ':

sys> select * from t_facturas where cod_cliente = '00125 'es of timestamp to_timestamp ('12-09-2011 12:05', 'DD-MM-YYYY HH24: MI');

sys> select * from t_facturas where cod_cliente = '00125 'es of scn 1.307.125;

Cal tenir en compte que mentre la sessió està en la manera Flashback Query, només podem executar sentències SELECT. Les sentències d'actualització (insert, delete i update) no estan permeses.

En el treball diari amb aquesta opció és útil l'ús de taules temporals per treballar amb les dades recuperades:

sys> create table t_facturas_antes (select * from t_facturas where cod_cliente = '00125 'es of timestamp to_timestamp ('12-09-2011 12:05,' DD-MM-YYYY HH24: MI ');

Altres opcions Flashback Query

A continuació llistem algunes funcionalitats que aporta Oracle relacionades amb operacions Flashback Query:
  • Flashback Version Query: Accés a l'històric de canvis d'una taula.
  • Flashback Transaction Query: Accés a l'històric de canvis d'una transacció determinada.
  • Flashback Table: Accés a dades anteriors, però per a una única taula.
  • Flashback Drop: Recuperar una taula esborrada ('paperera reciclatge').
  • Flashback Database: Permet deixar la BBDD tal com es trobava en un temps passat.Similar a restaurar un backup, però amb les limitacions temporals dels processos flashback, encara que molt més ràpid que recuperar la còpia del backup. Cal tenir el mode flashback activat, així com la flash recovery àrea.

Algunes d'aquestes opcions requereixen que el gestor sigui 'Enterprise Edition'.

Es tracta, com s'ha dit, d'una sentència força útil, amb múltiples opcions de "rebobinat" i que ens pot treure de més d'una dificultat.