プリントスタック TOKYO

データベースとセキュリティの世界から離れて早数年。過去の記憶を探しています。

LogMiner

「LogMiner」は、REDOログ(オンライン/アーカイブ)を操作するための機能です。 この「LogMiner」には、Oracle 9i から「サプリメンタル・ロギング」というREDOログに補助的な更新列以外の値を追加できるものが追加されています。

それでは「サプリメンタル・ロギング」のステータスを確認するところから見ていきます。

SQL>SELECT SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_ALL FROM V$DATABASE;

SUPPLEME SUP SUP
-------- --- ---
YES NO NO

次に開始します。このとき、オプションの指定には、いくつかあることに注意してください。

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

データベースが変更されました。

オプションには、"PRIMARY KEY"、"UNIQUE KEY"、"FOREIGN KEY"、"ALL" の4つがあります。
追加したら「サプリメンタル・ロギング」を開始します。

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

データベースが変更されました。

ステータスを見てみます。

SQL>SELECT SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_ALL 2 FROM V$DATABASE;

SUPPLEME SUP SUP
-------- --- ---
YES NO YES

ログ・モードの確認
まず、「LogMiner」を開始する前に、データベースがアーカイブ・ログ(ARCHIVELOG)で起動していることを確認することからはじめていきます。(NOARCHIVELOGモードでもアクティブなREDOログの操作が可能です。)Oracle データベースをデフォルトで作成すると、ログモードは「NOIARCHIVELOG」で起動しています。

SQL> SELECT LOG_MODE FROM V$DATABASE;

LOG_MODE
------------
NOARCHIVELOG

「NOARCHIVELOG」の場合

SQL> SHUTDOWN
データベースがクローズされました。
データベースがアンマウントされました。
ORACLEインスタンスがシャットダウンされました。

SQL> STARTUP MOUNT
ORACLEインスタンスが起動しました。

Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 83887460 bytes
Database Buffers 79691776 bytes
Redo Buffers 2945024 bytes
データベースがマウントされました。
データベースがオープンされました。
データベースがマウントされました。

SQL> ALTER DATABASE ARCHIVELOG;

データベースが変更されました。

対象のアーカイブ・ログを確認
下の例では、「2009年8月26日」のアーカイブ・ログを指定しています。

SQL> SELECT NAME, TO_CHAR(COMPLETION_TIME, 'yyyymmdd') FROM V$ARCHIVED_LOG
2 WHERE TO_CHAR(COMPLETION_TIME, 'yyyymmdd') = &date
3 /
dateに値を入力してください: 200908262: WHERE TO_CHAR(COMPLETION_TIME, 'yyyymmdd') = &date2: WHERE TO_CHAR(COMPLETION_TIME, 'yyyymmdd') = 20090826

NAME
--------------------------------------------------------------------------------
TO_CHAR(
--------
C:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORA10G\ARCHIVELOG\2009_08_26\O1_MF_

1_4_599G73OH_.ARC
20090826

C:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORA10G\ARCHIVELOG\2009_08_26\O1_MF_

1_5_599YYM5C_.ARC
20090826

解析したいログを指定

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE (-
> 'C:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORA10G\ARCHIVELOG\2009_08_26\O1_
MF_1_4_599G73OH_.ARC',-
> DBMS_LOGMNR.NEW);

PL/SQLプロシージャが正常に完了しました。

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(-
> 'C:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORA10G\ARCHIVELOG\2009_08_26\O1_
MF_1_5_599YYM5C_.ARC',-
> SYS.DBMS_LOGMNR.ADDFILE);

PL/SQLプロシージャが正常に完了しました。

LogMinerを開始

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-
> OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

PL/SQLプロシージャが正常に完了しました。

V$LOGMNR_CONTENTSビューから解析結果を取得

SQL> spool 'C:\logmnr_contens.log
SQL> SELECT TO_CHAR(TIMESTAMP,'YYYY/MM/DD HH24:MI:SS') AS TIMESTAMP,SQL_REDO
2 FROM V$LOGMNR_CONTENTS
3 WHERE USERNAME = 'SCOTT'
4 AND OPERATION IN ('INSERT','UPDATE','DELETE')
5 ORDER BY SCN;
~省略~
SQL> spool off