コンテンツ
Oracle LogMiner とは
オンラインREDOログ、あるいはアーカイブREDOログを読み込み、過去にどのような処理が行われたかを調べることができる機能
例えば以下のようなケースで使用可能
- 誤ってデータを DELETE してしまった
- AP から INSERT 処理を走らせたはずなのに DB から参照できない
- rollback された表を知りたい
- トランザクションを確認したい
検証
Archive Log Mode であることを確認
archive log list;
実行例
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/arch
Oldest online log sequence 2058
Next log sequence to archive 2060
Current log sequence 2060
No Archive Log Mode の場合以下のように設定しよう
alter database archivelog;
実行例
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/arch
Oldest online log sequence 2057
Current log sequence 2059
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 3774873600 bytes
Fixed Size 2931088 bytes
Variable Size 738199152 bytes
Database Buffers 1946157056 bytes
Redo Buffers 13844480 bytes
In-Memory Area 1073741824 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
データを挿入
この INSERT 文が後から確認したい処理
SQL> insert into scott.test values (sysdate);
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
対象のアーカイブログファイルを追加する
初回のアーカイブファイルの追加は dbms_logmnr.NEW とし、二回目以降は dbms_logmnr.ADDFILE とする
execute dbms_logmnr.add_logfile(logfilename=>'XXX',options=>dbms_logmnr.NEW);
execute dbms_logmnr.add_logfile(logfilename=>'XXX',options=>dbms_logmnr.ADDFILE);
実行例
SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/arch/log1.dbf',options=>dbms_logmnr.NEW);
PL/SQL procedure successfully completed.
SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/arch/log2.dbf',options=>dbms_logmnr.ADDFILE);
PL/SQL procedure successfully completed.
SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/arch/log3.dbf',options=>dbms_logmnr.ADDFILE);
PL/SQL procedure successfully completed.
まだアーカイブされていない REDO ログファイルをここで追加することも可能
LogMiner 起動
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
実行例
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
PL/SQL procedure successfully completed.
履歴を確認
分析する REDO データを参照するには、v$logmnr_contents ビューを参照する
実行例
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy/mm/dd HH24:MI:SS';
Session altered.
SQL> select username, timestamp,sql_redo from v$logmnr_contents where seg_name='TEST';
USERNAME TIMESTAMP SQL_REDO
---------- ------------------- -----------------------------------------
SYS 2022/01/03 18:24:53 insert into "SCOTT"."TEST"("COL1") values (TO_DATE('2022/01/03 18:24:53', 'yyyy/mm/dd HH24:MI:SS'));
LogMiner を終了する場合
exec dbms_logmnr.end_logmnr;
実行例
SQL> exec dbms_logmnr.end_logmnr;
PL/SQL procedure successfully completed.
-
REDOログ・ファイル分析のためのLogMinerの使用
docs.oracle.com