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;