Log Minner redo logların kullanılması ile analiz
yapılabilmesi, okuma yapılabilmesi hatta recover işlemlerin yapılmasını bize
sağlar. Az bilinse de zaman zaman hayat kurtaracak operasyonları bu sayede
çözebiliriz.
Log Minner database seviyesinde yapılan bazı dml hatalarının
geri alınmasına da olanak sağlar. Bunun yanında database üzerinde yapılan
işlemlerin audit’lenmesine de olanak
sağlar. Kullanıcıların yaptığı bir işlemin izinide sürebilirsiniz.
Şimdi nasıl konfigüre ediyoruz, içeriği nedir ve yaptığımız
küçük bir örnek ile detaylandıralım.
Log Minner kurulum ile birlikte gelen ve bir package create
edilmesi ile kullanılan bir opsiyondur. Bu package $ORACLE_HOME/rdbms/admin
dizininde dbmslm.sql dir.
Log minnerın konfigüre edilmesi sırasında create edilen
package içeriğinin özetine fikrimiz olması adına bir bakalım.
[oracle@s0134devdb0
admin]$ cat dbmslm.sql
create or
replace PACKAGE dbms_logmnr IS
--------------------
-- OVERVIEW
--
This package contains the procedures used by LogMiner ad-hoc query
--
interface that allows for redo log stream analysis.
--
There are three procedures and two functions available to the user:
--
dbms_logmnr.add_logfile() : to
register logfiles to be analyzed
--
dbms_logmnr.remove_logfile() : to remove logfiles from being analyzed
--
dbms_logmnr.start_logmnr() : to
provide window of analysis and
-- meta-data
information
--
dbms_logmnr.end_logmnr() : to
end the analysis session
--
dbms_logmnr.column_present() : whether a particular column value
-- is presnet in
a redo record
--
dbms_logmnr.mine_value() :
extract data value from a redo record
--------------------------
--
PROCEDURE INFORMATION:
-- #1
dbms_logmnr.add_logfile():
--
DESCRIPTION:
--
Registers a redo log file with LogMiner. Multiple redo logs can be
--
registered by calling the procedure repeatedly. The redo logs
--
do not need to be registered in any particular order.
--
Both archived and online redo logs can be mined. If a successful
--
call to the procedure is made a call to start_logmnr() must be
--
made before selecting from v$logmnr_contents.
......
......
......
-------------
--
PROCEDURES
---------------------------------------------------------------------------
--
Initialize LOGMINER
-- Supplies
LOGMINER with the list of filenames and SCNs required
-- to
initialize the tool. Once this procedure
completes, the server is ready
-- to
process selects against the v$logmnr_contents fixed view.
---------------------------------------------------------------------------
PROCEDURE
start_logmnr(
startScn IN
NUMBER default 0 ,
endScn IN
NUMBER default 0,
startTime IN
DATE default '',
endTime IN
DATE default '',
DictFileName IN
VARCHAR2 default '',
Options IN
BINARY_INTEGER default 0 );
PROCEDURE
add_logfile(
LogFileName IN
VARCHAR2,
Options IN
BINARY_INTEGER default ADDFILE );
PROCEDURE
end_logmnr;
FUNCTION
column_present(
sql_redo_undo IN
NUMBER default 0,
column_name IN
VARCHAR2 default '') RETURN BINARY_INTEGER;
FUNCTION
mine_value(
sql_redo_undo IN
NUMBER default 0,
column_name IN
VARCHAR2 default '') RETURN VARCHAR2;
PROCEDURE
remove_logfile(
LogFileName IN
VARCHAR2);
---------------------------------------------------------------------------
pragma
TIMESTAMP('1998-05-05:11:25:00');
END;
/
grant
execute on dbms_logmnr to execute_catalog_role;
create or
replace public synonym dbms_logmnr for sys.dbms_logmnr;
İçeriğinde bazı procedure, function
ve neler yaptığını görebiliyoruz. Sonunda bazı yetkiler veriyor ve kolay erişim
için bir public synonym yaratıyor.
Bunun öncesinde Log minner’ın
çalışması için supplemental loggingin
açık olması gerekiyor. supplementalloggingin ne olduğunu neye yarayıp hangi seviyelerde olduğunu diğer yazımda
belirtmiştim. Şimdi kontrol edip eğer enable değilse minimal seviyede loggingi
açalım
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;
SUPPLEMENTAL_LOG_DATA_MIN
NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
Database altered.
Şimdi yukarıda içeriğine baktığımı
dbms_logmnr paketi yaratalım
[oracle@
s0134devdb0 admin]$ pwd
/u01/app/oracle/product/11.2.0/dbhome_2/rdbms/admin
[oracle@
s0134devdb0 admin]$ sqlplus / as sysdba
SQL*Plus:
Release 11.2.0.4.0 Production on Wed Apr 6 11:27:21 2016
Copyright
(c) 1982, 2013, Oracle. All rights
reserved.
Connected
to:
Oracle
Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the
Partitioning and Automatic Storage Management options
SQL>
@/u01/app/oracle/product/11.2.0/dbhome_2/rdbms/admin/dbmslm.sql
Package
created.
Grant
succeeded.
Synonym
created.
SQL>
İlgili kullanıcıyı yetkilendirelim.
SQL>
GRANT EXECUTE_CATALOG_ROLE TO ilker;
Grant
succeeded.
SQL>
Log minner redologları okuyan bir
paket. Bu yüzden log minnera mevcut loğları tanıtalım.
Öncesinde log dosyalarının
bilgilerine bakıyoruz
SQL>
SELECT distinct member LOGFILENAME FROM V$LOGFILE;
LOGFILENAME
---------------------------------------------------------------------------------------------
+ORADATA/ocdev03/onlinelog/group_3.259.815671587
+ORADATA/ocdev03/onlinelog/group_1.257.815671585
+ORADATA/ocdev03/onlinelog/group_2.258.815671587
+ORAFRA/ocdev03/onlinelog/group_3.259.815671589
+ORAFRA/ocdev03/onlinelog/group_4.260.815671589
+ORADATA/ocdev03/onlinelog/group_4.260.815671589
+ORAFRA/ocdev03/onlinelog/group_1.257.815671585
+ORAFRA/ocdev03/onlinelog/group_2.258.815671587
8 rows
selected.
SQL>
Görüldüğü gibi +ASM yapısında
yedekli redo larım var.
Şimdi bunu package ekleyelim
11:38:39
SQL> BEGIN
DBMS_LOGMNR.ADD_LOGFILE('+ORADATA/ocdev03/onlinelog/group_1.257.815671585');
DBMS_LOGMNR.ADD_LOGFILE('+ORADATA/ocdev03/onlinelog/group_2.258.815671587');
DBMS_LOGMNR.ADD_LOGFILE('+ORADATA/ocdev03/onlinelog/group_3.259.815671587');
DBMS_LOGMNR.ADD_LOGFILE('+ORADATA/ocdev03/onlinelog/group_4.260.815671589');
END;
/
PL/SQL procedure successfully completed
Executed in 0.453 seconds
11:38:42 SQL>
Böylelikle
Log_Minner konfigürasyonu nu tamamlamış olduk.
Şimdi
Start edelim. (LogMiner'ı
başlatmak için birden fazla opsiyon bulunmaktadır. Belirli bir SCN numarası,
zaman aralığı verilerek ya da bütün logları kullanarak analiz
yaptırabiliriz.)
SQL> BEGIN
DBMS_LOGMNR.START_LOGMNR(options
=> dbms_logmnr.dict_from_online_catalog);
END;
/
PL/SQL procedure successfully completed
Executed in 1.359 seconds
SQL>
Sonuçlar
için v$logmnr_contents viewini
kullanırız.
Log_Minner
kapatılması.
SQL>
BEGIN
DBMS_LOGMNR.end_logmnr;
END;
/
PL/SQL procedure successfully completed
Executed in 1.359 seconds
SQL>
Bunun
üzerinden şöyle bir senaryo ile örnek verebiliriz.
İstemeden
silinen bir datanız oldu. Yada kimin sildiğini bulmanız gerekiyor. Bunun için
database bir yere restore edip buradan recover etmenize gerek yok J Zaman
aralığınız yaklaşık belli ise faydalı. Eğer yoksa dert değil schema ve obje
ismi (Tablo) varsa işimizi yine görecektir.
- Hemen yeni bir session açıp loglarımızı listeliyoruz.
- ilgili logları log_minnera aktarıyoruz.
- Istersek opsiyona göre istersek tüm logları kullanarak log_minnerı start ediyoruz.
- Evet şimdi Analiz edip iz sürebiliriz. Elimizde ki bilgiler ışığında v$logmnr_contents den schema ve tablo ismini varsa tarih aralığını, geçen dml cümleciğini filtreleyip hedefimize ulaşabiliriz
Ben şöyle bir sql ile örnek verdim:
SELECT
username,
TO_CHAR (timestamp, 'mm/dd/yy hh24:mi:ss') timestamp,
seg_type_name,seg_name,
table_space,
session# SID,
serial#,
operation,
sql_redo,
sql_undo,
session_info
FROM v$logmnr_contents
where seg_name = ''
and username = ''
böylelikle ilgili kayıtlara
ulaşabiliriz.
İyi Çalışmalar diliyorum.
Usta