LogMiner

Co to jest LogMiner i do czego służy?

LogMiner to wbudowana aplikacja Oraclowa, umożliwiająca przeglądanie logów REDO. W logach REDO przechowywane są informacje o wszystkich operacjach DML i DDL na bazie.

Kiedy LogMiner może się przydać co jest do niego potrzebne

Pomóc może wtedy gdy chcemy zobaczyć jakie operacje były wykonywane na bazie w danym przedziale czasowym. Do wykorzystania LogMinera może (ale nie musi) być konieczne ustawienie bazy w trybie ARCHIVELOG. Jeżeli baza nie jest w powyższym trybie możliwe będzie jedynie korzystanie z bieżących logów REDO.

Jak to się robi

Na początek pokażę jak dobrać się do bierzących logów REDO. Póżniej pokażę jak zrobić to samo dla logów archiwalnych.

Dla bierzących logów REDO

Najpierw chcemy obejrzeć jaki mamy pliki REDO. Korzystamy z dwóch widoków - v$log i v$logfile:

SQL> select l.GROUP#,l.SEQUENCE#,l.MEMBERS,l.ARCHIVED,l.STATUS,f.MEMBER
     from v$log l, v$logfile f
     where f.GROUP#=l.GROUP#
     order by GROUP#;

 GROUP#  SEQUENCE# MEMBERS ARC STATUS   MEMBER
------------------------------------------------------------------------------
 1      4699       1      YES INACTIVE /var/opt/oracle/TEST/oradata/redo01.log

 2      4700       1      YES INACTIVE /var/opt/oracle/TEST/oradata/redo02.log

 3      4701       1      NO  CURRENT  /var/opt/oracle/TEST/oradata/redo03.log

Mamy dane o plikach REDO. Teraz trzeba przypisać je do procesu logminera. Załóżmy że chcemy obserwować operacje od chwili bieżącej. Musimy więc wziąć plik przynajmniej redo3.log gdyż ma on status 'CURRENT'. Uwaga - poniższą czynność musimy wykonywać każdorazowo po otwarciu nowej sesji z bazą danych.

SQL>execute DBMS_LOGMNR.ADD_LOGFILE
   ( LOGFILENAME => '/var/opt/oracle/TEST/oradata/redo03.log',
    OPTIONS => DBMS_LOGMNR.ADDFILE);

sprawdzamy SCN (System Change Number)

SQL>select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
               844306699

Wykonujemy procedurę start z pakietu DBMS_LOGMNR.Składnia jak poniżej:

DBMS_LOGMNR.START_LOGMNR( 
   startScn           IN NUMBER default 0,
   endScn             IN NUMBER default 0,
   startTime          IN DATE default '01-jan-1988',
   endTime            IN DATE default '01-jan-2988',
   DictFileName       IN VARCHAR2 default '',
   Options            IN BINARY_INTEGER default 0 );

Musimy zaznaczyć od jakiego momentu w czasie mają być przeglądane logi. Wykonanie tego polecenia powoduje wystartowanie nowej sesji logminera.

SQL> execute DBMS_LOGMNR.START_LOGMNR
    ( STARTSCN => 844306699,OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG );

Procedura PL/SQL została zakończona pomyślnie.

Teraz mamy już zawartośc plików REDO w widoku V$LOGMNR_CONTENTS. Konstruujemy zapytanko - "pokaż sql dla wszystkich operacji jakie miały miejsce po zadanym punkcie w czasie".

SQL> select sql_redo from V$LOGMNR_CONTENTS where scn > 844307477;

Dla archiwalnych logów REDO

Informacje o wszystkich archiwalnych logach znajdziemy w widoku V$LOG_HISTORY.

SQL> select * from  V$LOG_HISTORY;

RECID      STAMP     THREAD# SEQUENCE#  FIRST_CHANGE# FIRST_TIM NEXT_CHANGE#
------- ---------- --------- ---------- ------------- --------- ------------
   4396  670146473         1       4396     843361888 07-NOV-08    843364871
   4397  670146514         1       4397     843364871 07-NOV-08    843367844
   4398  670146556         1       4398     843367844 07-NOV-08    843370750
   ...   ...               ...     ...      ...       ...          ...

Zauważmy że mamy podane widełki czasowe dla każdego pliku. Wiemy zatem jakie logi załadować. Teraz musimy tylko odnaleźć plik o podanym numerze.

Kiedy LogMiner nie pomoże

W przypadku gdy nie archiwizujemy logów (baza jest w trybie 'NOARCHIVELOG')nie damy rady przejrzeć zmian przed pewnym momentem w czasie.