Vous êtes sur la page 1sur 33

Récupération de base de

données Oracle
FLASHBACK
• Flashback est apparue avec Oracle Database 9i,
• Avec Oracle Database 10g et Oracle Database 11g, de nouvelles
notions de Flashback ont été ajoutées.
Le problème, c’est que cette notion de Flashback englobe beaucoup
de technologies qui souvent n’ont rien à voir les unes avec les autres.
D’abord qu’est ce que le l’architecture FlashBack ? C’est la
possibilité de faire des « Flashback », donc de faire des « retours
arrière » dans le temps, soit en faisant une récupération de données,
soit en voulant juste visualiser les données de ce moment la.
La famille flashback
• Il y a 8 types de Flashback !!!
1. Pour récupérer une table qui a été supprimée « accidentellement » : c’est
le Flashback Drop qu’il faudra utiliser.
2. Pour connaitre la valeur d’une ligne d’une table à une date donnée antérieure : c’est
le Flashback Query qu’il faudra utiliser.
3. Le Flashback Data Archive peut également répondre au besoin précédent.
4. Pour connaitre l’évolution de la valeur d’une ligne d’une table pour un intervalle de
dates donné : c’est le Flashback Versions Query qu’il faudra utiliser.
5. Mieux, si grâce a Flashback Query, vous avez localisé la date exacte et que vous
voulez revenir à la version de la table de cette date la, vous devrez
utiliser Flashback Table.
La famille flashback
6. Pour connaitre pour une transaction donnée, l’ordre ou les ordres qui
permettraient d’annuler cette transaction, c’est le Flashback Transaction
Query qu’il faudra utiliser.
7. Pour appliquer les ordres SQL de manière à annuler cette transaction, c’est
le Flashback Transaction Backout qu’il faudra utiliser.
8. Enfin si vous voulez rétablir toute la base de données jusqu’à un point antérieur
dans le temps en annulant toutes les modifications apportées depuis ce point,
C’est le Flashback Database qu’il faudra utiliser.
• Deux cas :
• le Flashback ne fait que lire des données,
• il fait de la modification de données.
Ou Flashback va chercher les données ?
• Les différents Flashback n’utilisent pas les mêmes zones pour
récupérer les données.
• Flashback Database utilise les journaux Flashback pour procéder à un
flashback de la base de données.
• Flashback Drop utilise la notion de « corbeille ».
• Flashback Data Archive utilise la notion d’archive Flashback.
• Flashback Table, Flashback Version Query, Flashback Query, Flashback
Transaction Query utilisent les données d’annulation (undo).
• Flashback Transaction Backout utilise les undo et les archivelogs.
Historique des Flashback

Oracle Version Flashback


Oracle Database 9i Flashback Query
Oracle Database 10g: Flashback Table
Flashback Drop
Flashback Version Query
Flashback Transaction Query
Flashback Database
Oracle Database 11g: Flashback Data Archive
Flashback Transaction Backout (en fait c’est l’évolution du Flashback
Transaction Query de la 10g)
Rappel sur date
• Les 2 principaux types utilisés
• DATE : champ de longueur fixe de 7 octets pour stocker une date (jour, mois , année
avec l heure, minutes, secondes)

• TIMESTAMP : champ comme date + les fractions de secondes, fondé sur la valeur d
horloge du SE

• La fonction SYSTIMESTAMP :
• Retourne la date, heure, mns , secondes, fractions de secondes courantes.
Fonction sur date
• La fonction TO_TIMESTAMP :
• Convertit une chaine de caractères avec un certain format en une valeur de
type date.
• TO_TIMESTAMP(chaine, format)
• Chaine : string
• Format : pour afficher la date numérique.
Quelques options des formats pour les types dates

MM Numéro du mois dans l année


MON Nom du mois sur 3 lettres
MONTH Nomdu mois en entier
DDD Numéro du jour dans l année 1..366
DD Numéro du jour dumois1..31
D Numéro du jour dela semaine1..7
DY Nom du jour sur3 lettres
DAY Nom du jour en entier
YYYY Annéesur 4 chiffres
YYY Les 3 derniers chiffres de l année
HH Heure de 1..12
HH24 Heure de 1..24
SS Secondes écouléesdans une minute
Select TO_CHAR(SYSTIMESTAMP,'DD/MM/YYYY HH24:MM:SS') la_date
from DUAL;

08/03/2024 11:03:26

Select TO_CHAR(SYSTIMESTAMP,'YYYY/MM/DD HH24:MM:SS') la_date


from DUAL;
2024/03/08 11:03:22
Flashback pour interroger le passé…
• La syntaxe de l’instruction SELECT devient :

SELECT ….
FROM nom_table
[AS OF {SCN|TIMESTAMP} valeur
SCN (System Change Number)
• Chaque transaction qui a fait commit, rend un nouvel état du système . Cet état est
identifié par un numéro : le SCN.

• Pour connaitre le SCN au cours d’une transaction, il faut appeler la fonction :


• GET_SYSTEM_CHANGE_NUMBER du package DBMS_FALSHBACK
• Cette fonction retourne le SCN au moment de l exécution (i.e. le SCN de la dernière
transaction qui a fait
• Attention : SCN n’est pas un numéro de transaction mais numéro du système.
SCN: Exemple

SELECT
DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
FROM DUAL ;

GET_SYSTEM_CHANGE_NUMBER
----------------------------------------------
1965481
Fonctions de conversion SCN  date et heure
SCN_TO_TIMESTAMP :
• Permet de convertir le numéro SCN en une valeur de type
TIMESTAMP.
• Exemple :
SELECT SCN_TO_TIMESTAMP( 1965481 )
From DUAL ;

SCN_TO_TIMESTAMP( 1965481)
----------------------------
26/02/09 13:29:10
Fonctions de conversion date et heure  SCN
TIMESTAMP_TO_SCN :

• Permet de convertir une valeur de type TIMESTAMP en SCN

• Exemple :

SELECT TIMESTAMP_TO_SCN(SYSTIMESTAMP) from


DUAL ;

TIMESTAMP_TO_SCN(SYSTIMESTAMP)
----------------------------
1969239
Mettre en œuvre le Flashback
• Les étapes
• Ouverture du mode flashback :
• EXECUTE
DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(n1);
n1 est un SCN
• Interrogation de données dans leur version au SCN de valeur n1

• Arrêter le mode Flashback :

EXECUTE DBMS_FLASHBACK.DISABLE;
Interrogation directe avec flashback…
• Interrogation de la table employe au 26 /04/2002
SELECT nom, prenom, fonction
from employe
AS OF TIMESTAMP TO_TIMESTAMP(‘26/04/2002’,’DD/MM/YYYY’)

Ou bien en récupérant le SCN avant le select


SELECT
TIMESTAMP_TO_SCN( TO_TIMESTAMP(‘26/04/2002’,’DD/MM/YYYY’) YYYY’))
From DUAL ;

TIMESTAMP_TO_SCN(26/04/2002)
----------------------------
1969239

SELECT nom, prenom,fonctionfrom employe


AS OF SCN 1969239;
FLASHBACK QUERY
UNDO_MANAGEMENT= AUTO
UNDO_TABLESPACE=UNDO
UNDO_RETENTION=2000
• Permet de voir la valeur de données telles quelle étaient dans le temps
(en se basant sur une date ou sur un SCN)

• Le paramètre UNDO_RETENTION (en secondes) sert à définir le


temps ou nous pourrons espérer remonter durant une requête
FLASHBACK.
CREATE TABLE EMP
(EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7, 2),
COMM NUMBER(7, 2),
DEPTNO NUMBER(2));

INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (7839, 'KING', 'PRESIDENT', NULL, to_date('17-11-1981', 'dd-mm-
yyyy'), 5000, NULL, 10);

COMMIT;

SELECT sal FROM EMP WHERE ename ='KING’;


SAL
-----
5000
Le 01 Janvier 2011 à 11h10
UPDATE emp SET sal=6000 WHERE ename='KING';
COMMIT;
SELECT sal FROM EMP WHERE ename ='KING';
SELECT sal
FROM EMP
AS OF TIMESTAMP TO_TIMESTAMP('2011-01-01 11:00:00','yyyy-mm-dd hh24:mi:ss')
WHERE
ename ='KING’;

SAL
-----
5000
Dans cet exemple, on peut voir la valeur de l’employé KING une date antérieure précisée
Ici à 11h00 le 1er janvier 2011.
FLASHBACK QUERY
• Autre façon en utilisant le package DBMS_FLASHBACK.

EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(sysdate- (N/1440));

• Cet ordre nous permet de voir la valeur des données de la base il y a N minutes
EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(sysdate- (3/1440));
PL/SQL procedure successfully completed

select * from emp where ename ='KING’;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


----- ---------- --------- ----- ----------- --------- --------- ------
7839 KING PRESIDENT 17/11/1981 5000,00 10
Si on désactive le flashback , on voit que la valeur actuelle est bien de 6000
EXECUTE DBMS_FLASHBACK.DISABLE;
PL/SQL procedure successfully completed

SELECT sal FROM EMP WHERE ename ='KING';


SAL
-----
6000
Et éventuellement on peut revenir à cette valeur dans le temps passé, cela nécessite une
requête comme suit :
UPDATE EMP SET sal =
(SELECT sal FROM EMP
AS of timestamp TO_TIMESTAMP ('2010-01-01 11:00:00','yyyy-mm-dd
hh24:mi:ss')
WHERE ename ='KING')
WHERE ename ='KING';
COMMIT;
SELECT sal FROM EMP WHERE ename ='KING';
SAL
-----
5000
FLASHBACK TABLE
• Permet de récupérer une table jusqu’à un point dans le passé sans nécessiter de
restauration à partir d’une sauvegarde.

• Cette opération va pouvoir être réalisée « in-place », pendant que la base de


données est ouverte, en annulant (rollback) uniquement les modifications
apportées aux tables indiquées et à leurs objets dépendants.
• Les données nécessaires à une opération Flashback Table sont extraites du
tablespace d’annulation.

• Pour procéder au flashback d’une table, vous devez activer le déplacement de


lignes dans cette table (enable row movement).
• Lorsque vous activez le déplacement de lignes, le serveur Oracle peut déplacer
une ligne dans la table.
ALTER TABLE EMP ENABLE ROW MOVEMENT;
L’utilisateur qui va faire cet action doit avoir le privilège système « FLASHBACK ANY TABLE » ou
le privilège « FLASHBACK » sur cette table
Exemple :
Suppression de toutes les lignes de la table EMP :

DELETE FROM EMP ;


14 rows deleted.
COMMIT;

Procéder au flashback de la table EMP à il y a 5 minutes


FLASHBACK TABLE EMP TO TIMESTAMP SYSTIMESTAMP - INTERVAL '5' MINUTE;
Flashback complete.

SELECT COUNT(*) FROM EMP ;


COUNT(*)
----------
14
On aurait pu aussi récupérer la table à une date précise : Exemple le 01 Janv. à minuit
FLASHBACK TABLE EMP
TO TIMESTAMP
TO TIMESTAMP TO_TIMESTAMP('2010-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');

On aurait pu aussi récupérer la table à un SCN précis :


var scn number;
BEGIN
:scn := TIMESTAMP_TO_SCN(SYSTIMESTAMP);
END;
/ FLASHBACK TABLE EMP TO SCN
PL/SQL procedure successfully completed. DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;

DELETE FROM EMP; Flashback complete.


14 rows deleted.
COMMIT; SELECT COUNT(*) FROM EMP ;
SELECT COUNT(*) FROM EMP
COUNT(*) COUNT(*)
---------- ----------
0 row selected. 14
FLASHBACK DROP

• Principe : Le Flashback Drop permet de restaurer les tables


accidentellement supprimées.

• Avec cette fonctionnalité, on va pouvoir annuler les effets d’une


instruction DROP TABLE sans avoir recours à la récupération jusqu’à
un point dans le temps traditionnelle.

• Le paramètre d’initialisation RECYCLEBIN doit être a ON (c’est le


défaut).
Exemple : Suppression de la table EMP

drop table EMP;


Table dropped.

select * from EMP;


ORA-00942: Table or view does not exist

select * from user_tables where table_name = ‘EMP’;


no rows selected

La données de la table ont été mises dans la corbeille.

SELECT object_name, original_name


FROM user_recyclebin;

OBJECT_NAME ORIGINAL_NAME
------------------------------ -------------
BIN$HGnc55/7rRPgQPeM/qQoRw==$0 EMP
Récupération de la table par un flashback drop.

flashback table emp TO BEFORE DROP ;


Flashback complete

select count(*) from EMP;


COUNT(*)
--------
14

Récupération de la table par un flashback drop et renommage en EMP2


flashback table emp TO BEFORE DROP RENAME EMP2 ;
Flashback complete

Si on veut supprimer la table et ne pas la mettre dans la corbeille:


drop table EMP PURGE ;

Attention :
Si la table avait des indexes ou des contraintes , ils vont être renommés en BIN$…
Après le flashback drop , ils conserveront ce nom en BIN$.
FLASHBACK VERSION QUERY

• Permet de consulter les versions d’une ligne qui existent entre deux
points dans le temps ou deux SCN (System Change Number).

• On va utiliser cette option pour extraire l’historique des lignes.


Select avec les versions
• La syntaxe de l’instruction SELECT devient :
SELECT ….
FROM
nom_table
[VERSIONS BETWEEN {SCN|TIMESTAMP}
valeur|MINVALUE ] AND
{valeur|MAXVALUE }
]
Select avec les versions

• Valeur: indique
• le SCN sil argument SCN est choisi
• Une Valeur de type << TIMESTAMP>>

• MINVALUE : indique:
• La valeur minimale du SCN pour afficher les versions
• MAXVALUE : indique

• La valeur maximale du SCN pour afficher les versions.


Pseudo colonnes pour les versions
• VERSIONS_STARTTIME : retourne la date de la 1ere version des
enregistrements de la requête
• VERSIONS_STARTSCN : retourne le SCN pour la premi ère version des
enregistrements de la requête
• VERSIONS_ENDTIME : date de la dernière version des enregistrements de
la requête
• VERSIONS_OPERATION : retourne un caractère qui indique le type de l
opération qui a créé la version. (I pour insert, U pour update, D pour delete
• VERSIONS_XID : identifiant de la transaction qui a crée la version pour
chaque enregistrements de la requête.
ALTER SESSION SET nls_timestamp_format = 'DD-MON-YYYY HH24:MI:SS';
UPDATE EMP SET SAL = 8000 WHERE ENAME=’KING’ ;
commit;
UPDATE EMP SET SAL = 9000 WHERE ENAME=’KING’ ;
commit;
SELECT sal,
VERSIONS_STARTSCN SSTART_SCN,
VERSIONS_STARTTIME START_TIME,
VERSIONS_ENDTIME END_TIME,
VERSIONS_XID, -- transaction_id of version
VERSIONS_OPERATION VO -- DML operation of version
FROM EMP VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
WHERE ENAME=’KING’ ;
ORDER BY VERSIONS_ENDTIME;

SAL STARTSCN STARTTIME ENDTIME VERSIONS_XID VO


------ -------- ---------------------- --------------------- --------------- ------
5000 1380863 10-AUG-2005 18:00:53.000 10-AUG-2005 18:00:05.000 040026008A010000 I
8000 1380491 10-AUG-2005 18:01:05.000 10-AUG-2005 18:01:14.000 040029008A010000 U
9000 1380486 10-AUG-2005 18:01:14.000 10-AUG-2005 18:01:26.000 040027008A010000 U

PS : On peut mettre une date ( format timestamp à la place de MINVALUE et MAXVALUE )

Vous aimerez peut-être aussi