ログマイナーに関する検証 その2

< ログマイナに関する検証 その弐 > ペンネーム チョビひげ

— みてみてv$logmnr_contents —

前回はログ・マイナーの実行手順の説明を行なった。

今回は実際にログ・マイナーを実行し、
v$logmnr_contents表に作成される内容を見てみたいと思う。

まずは簡単なUPDATE文を実行して、ログ・マイナーを実行してみよう。

*************************************************************

# scottユーザで実行

SQL> desc zura;

Name                                      Null?    Type
----------------------------------------- -------- -------------------
EMPNO                                     NOT NULL NUMBER(4)
ENAME                                              VARCHAR2(10)
JOB                                                VARCHAR2(9)
MGR                                                NUMBER(4)
HIREDATE                                           DATE
SAL                                                NUMBER(7,2)
COMM                                               NUMBER(7,2)
DEPTNO                                             NUMBER(2)

#1行をUPDATE

SQL> update zura set ENAME='Urashima' where ENAME='Momotaro';

SQL> commit;

# ここからsysユーザで実行
# ディクショナリ・ファイルの作成

SQL> exec dbms_logmnr_d.build(dictionary_filename=>
     'ora817dict.ora',dictionary_location=>'../u01');

# REDOログ・ファイルの登録(今回は特定のトランザクションを検証するために、
# 事前にログ・スイッチを行いアーカイブログ・ファイルを取得する)

SQL> exec dbms_logmnr.add_logfile(options=>dbms_logmnr.new,logfilename=>
     '../u01/arch0_28.dbf');

#ログ・マイナーの初期化
SQL> exec dbms_logmnr.start_logmnr(dictfilename=>
‘../u01/ora817dict.ora’);
[/sql]
# v$logmnr_contentsより検索
SQL> select scn, data_obj#, seg_owner, seg_name, operation
from v$logmnr_contents;

SCN DATA_OBJ# SEG_OWNER SEG_NAME OPERATION
———- ———– ———— ———– ——————
687902 0 INTERNAL
687902 0 START
687902 26065 SCOTT ZURA UPDATE
687904 0 COMMIT
[/sql]

上記のv$logmnr_contents表を検索した結果を見てみると、UPDATEとCOMMITで4
つのオペレーション(INTERNAL,START,UPDATE,COMMIT)のREDOレコードが作成さ
れているのが分かる。

REDOログ・ファイルのダンプファイルではSCN(system change number)などが
16進数表示であったが、v$logmnr_contents表では10進数表示になっており分
かりやすくなっている。
ちなみに、SCNはデータベースになんらかの障害が発生した場合に、バックア
ップファイルとREDOログ・ファイルからPointInTime回復を実行する際に指定
する事が出来る。

次にv$logmnr_contents表よりSQL_REDO、SQL_UNDO列を検索してみよう。

SQL> select data_obj#, operation, sql_redo, sql_undo
     2 from v$logmnr_contents;

DATA_OBJ#  OPERATION    SQL_REDO        
---------  ------------ -----------------
0          INTERNAL                
0          START        set transaction read write;
26065      UPDATE       update "SCOTT"."ZURA" set "ENAME" = 'Urashima'
                        where ROWID = 'AAAGXRAAFAAASDHAAO';
0          COMMIT       commit;

SQL_UNDO
-----------------------------------------------------------------------

update "SCOTT"."ZURA" set "ENAME" = 'Momotaro' 
where ROWID = 'AAAGXRAAFAAASDHAAO';

REDO、UNDOのSQL文が確認できる。
また、ログ・マイナーの初期化の際、ディクショナリ・ファイルを指定するこ
とにより、v$logmnr_contents表内で表示されるオブジェクト名、列名等の変換
も行なわれている。

ちなみに、ディクショナリを指定しなかった場合は以下のような表示になる。

# sysでユーザで実行

SQL> exec dbms_logmnr.add_logfile(options=>dbms_logmnr.new,logfilename=>
     '../u01/arc0_28.trc');

# ログ・マイナーの初期化

SQL> exec dbms_logmnr.start_logmnr();

# v$logmnr_contents表を検索

SQL> select scn, seg_owner, seg_name, operation, sql_redo 
     from v$logmnr_contents;

SCN     SEG_OWNER  SEG_NAME  OPERATION  SQL_REDO
------- ---------- --------- ---------- -------------------
346635                       START      set transaction read write;
346635  UNKNOWN              UPDATE     update UNKNOWN.Objn:3825 set 
                                        Col[2] = HEXTORAW('35cfba') 
                                        where ROWID = 'AAAA7xAABAAAGTUAAA';
346637                       COMMIT     commit;

オブジェクトのオーナ(SEG_OWNER)が表示されず、SQL_REDO列のオブジェクトID
や列番号がそのまま表示されており、非常に分かりづらい。

REDOログ・ログファイルを分析する際は、ディクショナリを指定することによ
って、SQL_REDO列やSQL_UNDO列のSQL文がコピーアンドペーストで利用可能にな
り、分析がやり易くなっていることが分かる。

以上、きょうもへいわな茅ヶ崎にて