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.
Łukasz Goszczyński goszczu.pl