ORACLE LOGMINER

Logminer Oracle’ın Archive log ları ve redologları logminer üzeinden incelememize ve veritabanındaki DML operasyonlarının tarihsel olarak undo bilgilerine ulaşabilmemizi sağlayan faydalı bir araçtır. Kullanıcı hatalarının undo bilgilerinden geri alınabilmesi, yapılan bazı işlemlerinin analiz edilmesi veya bir nevi audit mekanizması olarak kullanılabileceği gibi ayrıca yaşanan bazı DML problemlerini incelemek içinde kullanabilecek bir araçtır.

Redologları inceleyelim öncelikle;

--- redolog dosyayalarından birini logminera ekleyelim;

exec dbms_logmnr.add_logfile('+DATA/ESSODB/redo-11.log');

-- Logminer çalıştıralım;

 exec dbms_logmnr.start_logmnr(options=> dbms_logmnr.dict_from_online_catalog);

--Logminer üzerine aldığımız log dosyalarını artık sorgulayabiliriz (v$logmnr_contents) rahat çalışabilmek adına bunları bir tabloya aktaralım,

-- burada incelemek adına herşeyi tabloya aktarıyorum

 create table safedata as select * from v$logmnr_contents;

--tablo içeriğindeki önemli alanları inceleyelim;

select scn,timestamp,operation,seg_owner,seg_name,table_name,sql_redo,sql_undo from safedata;

Sql_undo kısmından yapılan DML işleminin undo suna erişip tekarar eski haline getirebiliriz.

Peki redologlarda işlemimiz yoksa archivelog lardan bu işlemi nasıl geri alabiliriz onuda inceleyelim;

Örnek olarak mine yapacağımız tarih aralığı 07-11-2021 05:00 ile aynı gün saat 06 arası olsun

 select timestamp_to_scn(to_timestamp('07-11-2021 05:00','DD-MM-YYYY HH24:MI')) 
 ||' and  '|| timestamp_to_scn(to_timestamp('07-11-2021 06:00','DD-MM-YYYY HH24:MI')) as secand_scn from dual;

SCN
--------------------------------------------------------------------------------------
419485359550 and 419503023654

bu tarihler (scn) arasındaki archivelogları getirelim;

SQL> select name from v$archived_log where next_change# between 419717767761 and  419735825198;

NAME
--------------------------------------------------
/disk/backup/arch/1_175273_1053603093.dbf
/disk/backup/arch/1_175274_1053603093.dbf
/disk/backup/arch/1_175275_1053603093.dbf
/disk/backup/arch/1_175276_1053603093.dbf
/disk/backup/arch/1_175277_1053603093.dbf
/disk/backup/arch/1_175278_1053603093.dbf
/disk/backup/arch/1_175279_1053603093.dbf
/disk/backup/arch/1_175280_1053603093.dbf
/disk/backup/arch/1_175281_1053603093.dbf
/disk/backup/arch/1_175282_1053603093.dbf
/disk/backup/arch/1_175283_1053603093.dbf

NAME
--------------------------------------------------
/disk/backup/arch/1_175284_1053603093.dbf
/disk/backup/arch/1_175285_1053603093.dbf
/disk/backup/arch/1_175286_1053603093.dbf
/disk/backup/arch/1_175287_1053603093.dbf
/disk/backup/arch/1_175288_1053603093.dbf
/disk/backup/arch/1_175289_1053603093.dbf
/disk/backup/arch/1_175290_1053603093.dbf
/disk/backup/arch/1_175291_1053603093.dbf
/disk/backup/arch/1_175292_1053603093.dbf
/disk/backup/arch/1_175293_1053603093.dbf
/disk/backup/arch/1_175294_1053603093.dbf

NAME
--------------------------------------------------
/disk/backup/arch/1_175295_1053603093.dbf
/disk/backup/arch/1_175296_1053603093.dbf
/disk/backup/arch/1_175297_1053603093.dbf
/disk/backup/arch/1_175298_1053603093.dbf
/disk/backup/arch/1_175299_1053603093.dbf
/disk/backup/arch/1_175300_1053603093.dbf
/disk/backup/arch/1_175301_1053603093.dbf

Bunların hepsini yüklemeye gerek yok birini örnek olarak yapacağız;

exec dbms_logmnr.add_logfile('/disk/backup/arch/1_175293_1053603093.dbf');
 
EXEC dbms_logmnr.start_logmnr(options=> dbms_logmnr.dict_from_online_catalog);
 
create table safearchive as select * from v$logmnr_contents;

select scn,timestamp,operation,seg_owner,seg_name,table_name,sql_redo,sql_undo from safearchive;
 

Mutlaka logminer ile işimiz bittikten sonra kapatmalıyız;

 exec dbms_logmnr.end_logmnr;