Tous les changements apportés à la base de données sont enregistrées dans les fichiers Redo Log afin que les opérations de récupération de base puissent être réalisées.
LOGMINER est un outil ORACLE qui permet d’extraire, de lire les informations contenues dans les REDOLOG et ARCHIVELOG.
Dans cet article nous verrons dans un premier temps la lecture des REDOLOG.
Etape N° 1
Connexion en user SYS
On exécute le DBMS_LOGMNR avec le path des fichiers redolog à analyser.
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(logfilename =>
'C:\oracle\product\10.2.0\oradata\bdd\redo01.log',options => DBMS_LOGMNR.NEW);
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(logfilename =>
'C:\oracle\product\10.2.0\oradata\bdd\redo02.log',options => DBMS_LOGMNR.ADDFILE);
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(logfilename =>
'C:\oracle\product\10.2.0\oradata\bdd\redo03.log',options => DBMS_LOGMNR.ADDFILE);
Vous pouvez voir les dates/heures des switch logfile et les SCN par cette requête.
SQL> SELECT FILENAME,
LOW_TIME,
HIGH_TIME,
LOW_SCN,
NEXT_SCN
FROM V$LOGMNR_LOGS;
Etape N° 2
On démarre LOGMINER.
A partir de cet instant une vue V_$LOGMNR_CONTENTS sera disponible et alimentée.
SQl> EXECUTE DBMS_LOGMNR.START_LOGMNR(options=>
DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG +
DBMS_LOGMNR.NO_ROWID_IN_STMT +
DBMS_LOGMNR.NO_SQL_DELIMITER);
Vous pouvez spécifier une date et une heure pour cibler vos recherches, dans l’exemple ci dessous je souhaite toutes les transactions à partir du 16/01/2010 à 20h45.
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(STARTTIME =>
to_date('16/01/2010 20:45:00','DD/MM/YYYY HH24:MI:SS'));
Etape N° 3
On interroge la vue V_$LOGMNR_CONTENTS ou la table V$LOGMNR_CONTENTS.
Dans la colonne SQL_REDO = Transaction faite.
Dans la colonne SQL_UNDO = Transaction à faire pour défaire
SELECT USERNAME AS USR,
SEG_OWNER AS OWNER,
SCN,
TIMESTAMP,
(XIDUSN || '.' || XIDSLT || '.' || XIDSQN) AS XID,
SQL_REDO,
SQL_UNDO
FROM V$LOGMNR_CONTENTS
WHERE USERNAME IN ('USER') -- remplacer USER par vos USERS
AND SEG_OWNER IN ('USER');
Une requête pour faire une statistique des tables les plus mises à jour ?
SELECT SEG_OWNER,
TABLE_NAME,
SEG_NAME,
COUNT(*) AS Hits
FROM V$LOGMNR_CONTENTS
WHERE SEG_NAME NOT LIKE '%$'
AND SEG_OWNER in ('USER')
AND USERNAME in ('USER')
GROUP BY SEG_OWNER,
TABLE_NAME,
SEG_NAME
ORDER BY Hits DESC;
Etape N° 4
On ferme LOGMINER. La vue V_$LOGMNR_CONTENTS est purgée.
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();
On ré exécute l’étape 1 à 4 pour analyser un autre redolog.