
Flashback Query Oracle : Interroger les données à un instant passé
La Flashback Query est une fonctionnalité puissante d’Oracle qui permet d’interroger les données telles qu’elles existaient à un moment précis dans le passé. Que vous ayez besoin de récupérer des données supprimées accidentellement ou d’auditer des modifications, la Flashback Query est un outil indispensable dans l’arsenal de tout développeur ou DBA Oracle.
Définition et utilisation de la Flashback Query
La Flashback Query est une extension de la commande SELECT introduite par Oracle dès la version 9i. Elle exploite le mécanisme d’Undo Data (données d’annulation) stocké dans le tablespace UNDO pour reconstituer un instantané cohérent des données à un moment antérieur.
Cas d’usage en entreprise
- Récupération accidentelle : Un utilisateur a supprimé des lignes par erreur sans avoir commis un
COMMITtrop ancien. - Audit et conformité : Comparer l’état actuel des données avec leur état à une date donnée pour répondre à des exigences légales ou réglementaires.
- Débogage applicatif : Identifier quand et comment une valeur incorrecte a été insérée dans une table.
- Analyse temporelle : Suivre l’évolution de données financières ou commerciales sur une période précise.
Prérequis : La Flashback Query nécessite que le paramètre UNDO_RETENTION soit correctement configuré et que suffisamment d’espace UNDO soit disponible. Par défaut, ce paramètre est souvent fixé à 900 secondes (15 minutes), mais il peut être ajusté par le DBA selon les besoins métier.
Syntaxe de la Flashback Query Oracle
Il existe deux variantes principales pour spécifier le point dans le temps à interroger : via un timestamp (horodatage) ou via un SCN (System Change Number).
Syntaxe avec AS OF TIMESTAMP
SELECT colonne1, colonne2, ...
FROM nom_table
AS OF TIMESTAMP timestamp_expression
[WHERE condition];
Syntaxe avec AS OF SCN
SELECT colonne1, colonne2, ...
FROM nom_table
AS OF SCN numero_scn
[WHERE condition];
Explication des paramètres essentiels
AS OF TIMESTAMP: Permet de spécifier un point dans le temps sous forme de date/heure. On utilise souventSYSTIMESTAMP - INTERVAL 'N' MINUTE/HOURou une valeur littérale.AS OF SCN: Utilise le numéro de changement système Oracle, un identifiant interne unique et précis qui progresse à chaque transaction. Obtenu viaDBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBERou la vueV$DATABASE.timestamp_expression: Toute expression Oracle retournant un typeTIMESTAMP, commeTO_TIMESTAMP('2024-06-01 14:30:00', 'YYYY-MM-DD HH24:MI:SS').numero_scn: Un entier représentant un SCN valide dans la fenêtre d’UNDO disponible.
Note importante : La Flashback Query ne fonctionne que dans la limite de la rétention UNDO configurée. Au-delà, Oracle lèvera une erreur ORA-01555: snapshot too old.
Exemples pratiques de Flashback Query
Exemple 1 – Récupérer des commandes supprimées par erreur
Contexte métier : Un opérateur du service commercial a accidentellement supprimé toutes les commandes du client numéro 1042 ce matin. Vous devez les retrouver pour les réinsérer.
-- Interroger la table COMMANDES telle qu'elle existait il y a 2 heures
-- afin de retrouver les lignes supprimées pour le client 1042
SELECT
commande_id,
client_id,
montant,
date_commande,
statut
FROM commandes
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' HOUR)
WHERE client_id = 1042;
-- Une fois les données identifiées, on peut les réinsérer :
INSERT INTO commandes (commande_id, client_id, montant, date_commande, statut)
SELECT
commande_id,
client_id,
montant,
date_commande,
statut
FROM commandes
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' HOUR)
WHERE client_id = 1042;
COMMIT;
Cet exemple illustre l’un des cas les plus fréquents en production : la récupération rapide de données sans restauration de sauvegarde, évitant ainsi un arrêt de service coûteux.
Exemple 2 – Auditer la modification d’un salaire avec AS OF SCN
Contexte métier : Le service RH constate qu’un salaire a été modifié de façon suspecte dans la table EMPLOYES. Vous connaissez le SCN approximatif avant la modification grâce aux logs applicatifs.
-- Récupérer le SCN actuel pour référence
SELECT CURRENT_SCN FROM V$DATABASE;
-- Résultat supposé : 4875320
-- Comparer le salaire actuel avec celui avant la modification
-- en utilisant un SCN antérieur enregistré dans les logs
SELECT
employe_id,
nom,
prenom,
salaire AS salaire_avant_modification
FROM employes
AS OF SCN 4870000 -- SCN enregistré avant la modification suspecte
WHERE employe_id = 2087;
-- Comparer avec la valeur actuelle
SELECT
employe_id,
nom,
prenom,
salaire AS salaire_actuel
FROM employes
WHERE employe_id = 2087;
En juxtaposant les deux résultats, le responsable RH peut immédiatement constater la différence de salaire, identifier l’écart et engager la procédure d’audit interne appropriée.
Erreurs courantes avec la Flashback Query
Erreur : ORA-01555 – Snapshot too old
C’est l’erreur la plus fréquente rencontrée avec la Flashback Query. Elle survient lorsque vous tentez d’interroger des données à un point dans le temps trop éloigné, pour lequel les données d’annulation (UNDO) ont déjà été écrasées par de nouvelles transactions.
-- Message d'erreur Oracle :
-- ORA-01555: snapshot too old: rollback segment number X
-- with name "..." too small
Solutions :
- Augmenter UNDO_RETENTION : Demandez à votre DBA d’augmenter le paramètre
UNDO_RETENTION(exprimé en secondes) :
ALTER SYSTEM SET UNDO_RETENTION = 3600;(1 heure) - Agrandir le tablespace UNDO : Un UNDO_RETENTION plus long nécessite davantage d’espace disque alloué au tablespace UNDO.
- Activer la garantie UNDO : Pour les tables critiques, activez
RETENTION GUARANTEEsur le tablespace UNDO afin qu’Oracle ne recycle pas les segments d’annulation avant expiration du délai :
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE; - Alternative : Si le délai est dépassé, envisagez d’utiliser Flashback Table ou une restauration depuis une sauvegarde RMAN.
Résumé de la Flashback Query Oracle
| Point clé | Détail |
|---|---|
| Objectif | Interroger des données à un état passé sans restauration |
| Mécanisme | Exploitation des segments UNDO d’Oracle |
| Syntaxe principale | SELECT ... FROM table AS OF TIMESTAMP / AS OF SCN |
| Limite temporelle | Dépend du paramètre UNDO_RETENTION |
| Erreur principale | ORA-01555: snapshot too old |
| Versions Oracle | Disponible depuis Oracle 9i |
| Droits nécessaires | Privilège SELECT sur la table concernée |
| Compléments | Flashback Table, Flashback Drop, Total Recall (FDA) |
Bonnes pratiques Oracle
- Enregistrez les SCN critiques dans vos applications : Avant toute opération de masse (batch de suppression ou mise à jour), capturez le SCN courant avec
SELECT CURRENT_SCN FROM V$DATABASEet stockez-le dans une table de logs. Cela vous permettra de réaliser une Flashback Query précise et fiable sans avoir à estimer un timestamp approximatif. - Dimensionnez correctement votre tablespace UNDO : Travaillez avec votre DBA pour définir un
UNDO_RETENTIONadapté à votre contexte métier (idéalement entre 1 et 24 heures pour les environnements de production sensibles), et assurez-vous que l’espace disque disponible le supporte. Un UNDO sous-dimensionné rendra la Flashback Query inutilisable au moment où vous en aurez le plus besoin.
Aller plus loin
La Flashback Query est la porte d’entrée d’un ensemble complet de fonctionnalités de récupération temporelle Oracle. Pour approfondir vos connaissances, consultez ces sujets complémentaires :
- Flashback Table Oracle : Apprenez à restaurer une table entière à un état antérieur en une seule commande, sans restauration de sauvegarde.
- Flashback Drop Oracle : Découvrez comment récupérer une table accidentellement supprimée grâce à la corbeille Oracle (Recycle Bin).
- Gestion du tablespace UNDO Oracle : Maîtrisez la configuration et le dimensionnement du tablespace UNDO pour garantir la fiabilité de toutes vos opérations de Flashback.
Sur le même thème
- ROLE Oracle SQL : Gérer les droits et privilèges
- RESTORE POINT Oracle : Gérer les Points de Restauration SQL
- DATABASE LINK Oracle : Connexion entre bases de données
- REVOKE Oracle : Révoquer les privilèges SQL facilement
- CREATE USER Oracle : créer un utilisateur SQL facilement
- FLASHBACK DATABASE Oracle : restauration rapide
