Les REDO LOGs Fichiers contenant toutes les informations sur toutes les
transactions survenues dans notre base de données préférée. Le problème de
ces fichiers c'est que l'on ne peut pas éditer le contenu aussi facilement.
C'est pour cela que Oracle nous à fournit un outils très pratique permettant
d'analyser et d'utiliser le contenu de ces fichiers REDO LOG.
Vous pourrez utiliser cet utilitaire pour faire un audit des actions effectuées
sur la base, sur un objet ou même effectuées par un utilisateur précis.
Dans cet article je vais vous expliquer les fonctions de base et comment
utiliser cet utilitaire.
1.2. Nouveautés de la 9i
Depuis sa création, LogMiner a beaucoup évolué.
Voici la liste des dernières fonctionnalités qui lui ont été ajoutées :
Support des ordres DDL (Maintenant LogMiner est en mesure d'extraire les ordres DDL qui ont été exécuté sur la base de données. Ils sont affichés dans la colonne SQL_REDO).
Capacités à traduire les DML associés avec des Index en Cluster.
Support des lignes chaînées et des lignes migrées.
Support des INSERT en mode Direct Path.
Création du dictionnaire dans les fichiers REDO LOG.
Possibilité d'utiliser le dictionnaire de la base de données.
Détection de l'état et de la validité du dictionnaire de données de LogMiner.
Capacité à détecter automatiquement les objets crées après la création du dictionnaire de LogMiner.
Possibilité d'appliquer directement les ordres DML appliqués sur le dictionnaire de la base de données sur le dictionnaire de LogMiner (seulement pour le dictionnaire LogMiner contenu sur un fichier ou pour le dictionnaire LogMiner contenu dans les fichiers REDO LOG).
Possibilité de ne pas prendre en compte les blocs corrompus.
Affichage des ordres REDO et UNDO basés sur les informations de la clé primaire de la table.
Nouvelle interface graphique (intégrée à OEM).
Extraction des transactions validées et non plus de toutes les transactions.
Accès aux données dans les fichiers REDO LOG courants.
1.3. Limitations
Bien que LogMiner soit un outil très puissant, il existe quelques restrictions relatives à son utilisation. Par exemple :
LogMiner ne supporte pas les objets de type LONG et LOBS, les objects types, les collections (nested table et varrays), les objects ref, les index organized tables.
Pour le Direct Path la clause LOGGING doit être utilisée et la base doit être en mode ARCHIVELOG.
2. Installation
L'installation de LogMiner est très simple. Et oui il vous suffit juste de lancer les deux scripts suivants en tant que SYS :
<oracle home>/rdbms/admin/dbmslm.sql qui installe le package DBMS_LOGMNR qui vous servira à analyser les REDO LOG, ainsi que des procédures, vues et tables publiques.
<oracle home>/rdbms/admin/dbmslmd.sql qui installe le package DBMS_LOGMNR_D qui servira à construire le dictionnaire de données.
Exemple d'installation :
sqlplus /nolog
CONNECT / AS SYSDBA
@<oracle home>\rdbms\admin\dbmslm.sql
@<oracle home>\rdbms\admin\dbmslmd.sql
3. Comment ça marche
3.1. En mode ligne de commande
Dans ces exemples j'ai utilisé une base Oracle 9.0.2 en mode NOARCHIVE. J'ai utilisé la nouvelle fonctionnalité de LogMiner pour accéder aux REDO LOG courant. Attention toutefois à ne pas utiliser celui en cours d'utilisation.
La première étape consiste à créer un Snapshot du dictionnaire de données afin de pouvoir avoir les définitions des objets présents dans la base de données.
Avant de générer notre dictionnaire nous allons initialiser le paramètre UTL_FILE_DIR grâce à la commande suivante sous Oracle9i :
SQL> ALTER system SET utl_file_dir='c:\temp\' SCOPE=spfile;
Ou en ajoutant cette ligne au fichier init.ora :
utl_file_dir=c:\temp\
Puis redémarrez la base. Ensuite lançons la création du dictionnaire de données de LogMiner.
Dans cet exemple nous créerons notre dictionnaire dans un fichier plat (il est aussi possible de créer ce dictionnaire dans les fichiers REDO LOG avec l'option store_in_redo_logs ou bien d'utiliser le dictionnaire de données courant, cela sera spécifié lors du démarrage de l'instance LogMiner).
Exemple de création du dictionnaire de données dans les fichiers REDO LOG :
Une fois le dictionnaire de LogMiner crée, il va falloir lui spécifier manuellement les fichiers REDO LOG (et les fichiers REDO LOG archivés) que l'on souhaite analyser.
Le premier fichier REDO LOG à analyser devra être ajouté avec la commande suivante :
Il existe de nombreuses options (à spécifier avec le paramètre options) pour démarrer la session LogMiner, voici les plus intéressantes :
COMMITTED_DATA_ONLY : N'affichera dans les vues que les données qui auront été validées. Ce qui vous permettra de ne pas polluer vos résultats avec les données non annulées ou encore en cours de transactions.
DICT _FROM_ONLINE_CATALOG : Permet de démarrer une session LogMiner sans avoir généré un dictionnaire dans un fichier plat ou dans les REDO LOGs.
DICT_FROM_REDO_LOGS : Permet de spécifier à LogMiner qu'il va trouver son propre dictionnaire dans un des REDO LOGs que vous aurez spécifié avec la commande DBMS_LOGMNR.ADD_LOGFILE.
CONTINUOUS_MINE : Permet d'ajouter automatiquement tout les fichiers REDO LOG archivés et en cours, vous n'avez besoin de spécifier qu'un seul fichier REDO LOG.
Il est bien sur possible de combiner plusieurs options à la fois comme dans l'exemple suivant :
Il existe 4 vues dynamiques liées à notre session LogMiner (celles-ci n'existent que pendant notre session LogMiner)
V$LOGMNR_DICTIONARY : Cette vue contient les informations sur le dictionnaire de données de LogMiner.
V$LOGMNR_PARAMETERS : Cette vue contient les informations concernant la session LogMiner en cours.
V$LOGMNR_LOGS : Cette vue contient les informations sur tous les fichiers REDO LOG qui ont été ajoutés pour cette session.
V$LOGMNR_CONTENTS : Cette vue contient les informations issues des fichiers REDO LOG.
Maintenant que nous avons lancé notre session LogMiner nous allons rechercher toutes les informations qui ont été effectuées sur la table EMP du user SCOTT.
SELECT scn, operation, sql_redo, sql_undo
FROM v$logmnr_contents
WHERE seg_owner='SCOTT' AND seg_name='EMP';
Et ensuite il nous restera juste à clôturer notre session LogMiner avec la commande
SQL> EXECUTE Dbms_Logmnr.end_logmnr;
3.2. Exemple d'utilisation en mode ligne de commande
Recherche d'action sur une table en particulier.
Dans cet exemple on va considérer que des manipulations incorrectes ont été effectuées sur la table EMP de l'utilisateur SCOTT.
Avant toute chose (et pour gagner du temps) nous allons choisir notre REDO LOG. Il est évident que les actions suivantes ne sont pas nécessaires dans un environnement de production.
SQL> CONNECT / AS sysdba
Connecté.
SQL> ALTER SYSTEM SWITCH LOGFILE;
Système modifié.
SQL> SELECT * FROM v$log WHERE STATUS ='CURRENT';
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TI
------------- --------
2 1 15 104857600 1 NO CURRENT
1468349 29/04/04
Voici les manipulations incorrectes à effectuer en tant qu'utilisateur SCOTT:
CONNECT scott/tiger@<votre base>;
UPDATE emp SET SAL=1000;
UPDATE emp SET SAL=10000 WHERE ename='KING';
COMMIT;
SQL> connect / as sysdba
Connecté.
SQL> ALTER SYSTEM SWITCH LOGFILE;
Système modifié.
SQL> SELECT * FROM v$log WHERE STATUS ='CURRENT';
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TI
------------- --------
3 1 16 104857600 1 NO CURRENT
1468800 29/04/04
Avec cet état nous savons donc que le REDO LOG à fournir à LogMiner sera un des REDO LOG du groupe 2.
On crée maintenant le dictionnaire de données pour LogMiner
Pour afficher les ordres Undo et Redo avec des informations basées sur la clé primaire, il nous faudra demander à Oracle de stocker de manière explicite un surcroît d'informations dans les fichiers REDO LOGs.
Au niveau de la base de données
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
Au niveau de la table
ALTERTABLE scott.emp add supplemental log group emp_group_1 (empno);
Ensuite on relance toutes les actions du LogMiner et on obtient le résultat suivant :
Depuis la version Oracle 9i, l'interface graphique OEM c'est vu ajouter une nouvelle section LogMiner viewer. Cette nouvelle interface graphique n'est disponible que sur un serveur OEM (et donc non disponible en mode autonome).
Première étape : se connecter au serveur OEM (vous devrez l'avoir installer préalablement)
Ensuite on lance le LogMiner Viewer
Nous arrivons alors sur l'interface principale du LogMiner Viewer.
L'exemple suivant utilisera les options par défaut. La première tâche a effectuer ici sera de créer notre interrogation. Je vous laisse le soin de regarder les différentes options qui sont à votre disposition dans cet outil graphique.
Voici donc la création de l'interrogation ainsi que son résultat
Ensuite il vous suffira de cliquer sur Exécuter et LogMiner Viewer exécutera de manière automatique les actions nécessaires.
4. Annexes
Attention : pour pouvoir consulter ces documents vous devez avoir un compte sur OTN (Oracle Technology Network) valide.
Vous pouvez en créer un gratuitement en suivant ce lien