dimanche 6 octobre 2013

Techniques de FLASHBACK d'ORACLE

1- Vue d’ensemble
Les techniques de flashback sont un ensemble de fonctionnalités proposées par Oracle qui permettent de voir l’état passé de données, ou de ramener une table ou la totalité de la base de données dans le passé.
Les fonctionnalités proposées sont les suivantes :

 - Flashback Query : permet de lire les données telles qu’elles étaient à un instant dans le passé (appary en version 9i).

- Flashback Version Query : permet de voir toutes les versions d’une ligne sur un certain intervelle de temps (apparu en version 10).

- Flashback Transaction Query) : permet de voir les modifications réalisées par une ou plusieurs transactions sur un certain intervalle de temps (apparue en version 10).

- Flashback Transaction : permet d’annuler les modifications d’une transaction, et de ses transactions dépendantes( apparue en version 11).

- Flashback Data Archive (Oracle Total Recall) : permet de conserver sur le long terme, toutes les modifications apportées à une table (apparue en version 11).

- Flashback Table : permet de ramener une table dans l état où elle était, juste avant sa suppression (apparue en version 10).

- Flashback Database : permet de ramener la totalité de la base de données dans l’état où elle était à un certain moment dans le passé (apparue en version 11).

Seule la fonctionnalité Flashback Query est disponible dans toutes les éditions de la base de données (et donc notamment en Standart Edition).
La fonctionnalité Flashback Data Archive, est une option de l’Entreprise Edition et nécessite donc, une licence supplémentaire.

Les autres fonctionnalités de Flashback nécessitent l’Entreprise Edition, mais sans option supplémentaire.
Les fonctionnalités de Flashback de requête (Flashback Query, Flashback Version Query et Flashback Transaction Query), et la fonctionnalité de Flashback Table, utilisent les informations d’annulation pour revenir en arrière. Le paramètre UNDO_RETENTION et le tablespace d’annulation doivent donc être correctement dimensionnés, si vous souhaitez pouvoir retourner loin dans le passé.

2- Niveau ligne
Flashback Query

Pour lire les données telles qu’elles étaient à un instant donné du passé, vous pouvez utiliser l’option AS OF sur une table présente dans la clause FROM d’une requête SELECT.

Syntaxe :
Nom_table AS OF { TIMESTAMP | SCN } expression

L’option TIMESTAMP permet de retourner à un instant donné du passé en indiquant une date et une heure ; dans ce cas, l’expression doit être de type TIMESTAMP. L’option  SCN permet de retourner à un instant donné du passé en indiquant un numéro SCN ; dans ce cas, l’expression doit être un nombre.


SQL> select   *   from   emp   where   empno = 7369;

     EMPNO ENAME      JOB              MGR    HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- --------------------------------
      7369 SMITH     CLERK                  7902    17/12/80               800                        20

SQL>  select to_char(sysdate, 'DD/MM/YYY HH24:MI:SS') "SYSDATE",
  2  dbms_flashback.get_system_change_number "SCN"
  3  FROM dual;

SYSDATE                  SCN
------------------ ----------
06/10/013 15:31:48    3446120



La fonction GET_SYSTEM_Change_NUMBER du package  DBMS_FLASHBACK retourne le numéro SCN courant. Il faut le privilège  EXECUTE sur le package pour l’utiliser.

Un peu plus tard :


SQL>  update emp set ename = 'ZAKARIA' where empno = '7369';
1 ligne mise à jour.
SQL> commit;
Validation effectuée.

SQL> select to_char(sysdate, 'DD/MM/YYY HH24:MI:SS') "SYSDATE",
  2  dbms_flashback.get_system_change_number "SCN"
  3  FROM dual;

SYSDATE                   SCN
------------------ ----------
06/10/013 15:38:41    3446364



Maintenant je vais retourner vers le passé avec la notion du temps :

SQL>  SELECT *  FROM EMP 
  2  AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '10' minute
  3  where empno = 7369;
  
  EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
--------- ---------- --------- ---------- -------- ---------- ---------- ----------
     7369 SMITH      CLERK               7902 17/12/80             800                              20



Ou bien avec la notion du SCN :


SQL> SELECT *  FROM EMP 
  2  AS OF SCN 3446120
  3  where empno = 7369;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH              CLERK           7902 17/12/80        800                                  20




NB : c'est un résumé de la partie FLASHBACK du livre "Administration ORACLE 11g" de OLIVIER HEURTEL.