ログマイナー再び!! その3

投稿日: 2007年10月10日

<ログマイナー再び!! その3>
ペンネーム: ぽっちゃりメタボン

こんにちは、ぽっちゃりメタボンです。
すっかり寒くなってきましたが、今週もはりきって検証しちゃいます。

▼ 前回のおさらい

前回はログマイナーを実行する上で必要となるLogMiner ディクショナリに
ついて以下の指定が可能であることを確認していきました。

1.) オンラインカタログを指定。
2.) REDOログファイルへLogMinerディクショナリを抽出し、指定。
3.) フラットファイルへLogMinerディクショナリを抽出し、指定。

また、その中でもオンラインカタログを使用し、ディクショナリ情報が変更
される状況を作った場合には、正しくSQLの再構築が行えないことを確認す
ることができました。
ただし、上記状況においては 事前にREDOログファイルへLogMinerディクショ
ナリを抽出(その時点でのディクショナリ情報のスナップショットを保存)し
ておく事により、SQLの再構築を正しく行うことが可能になります。

で、

今回は REDOログファイルへ出力したディクショナリがどういったものなのか
をREDOログダンプを通して確認していきたいと思います。

※前回お伝えするのを忘れておりましたが、2.)を行う場合にはアーカイブ
ログ運用されていることが前提となります。

▼ 環境のおさらい

OS:Red Hat Enterprise Linux ES release 3
DB:10gR2(10.2.0.1)

▼ ダンプを取得してみるのだ!!

1. まず、ディクショナリをアーカイブREDOログへ抽出しておきます。

SQL> execute dbms_logmnr_d.build(options=> -
          dbms_logmnr_d.store_in_redo_logs);

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

2. 出力ファイルを確認します。

SQL> select name,THREAD#, SEQUENCE# from v$archived_log
          where DICTIONARY_BEGIN ='YES'
NAME
---------------------------------------------------------------------
/home/ora102/oracle/flash_recovery_area/ORA102/archivelog/2007_10_08/
o1_mf_1_57_3jl812bf_.arc

3. REDOログのダンプを取得します。
SQL> alter system dump logfile ‘[対象のREDOログをフルパスで指定]’;

これにてダンプファイルが初期化パラメータ user_dump_dest へ出力されま
す。

ディクショナリ情報を抽出したREDOログとは
どのような構造になっているのでしょうか。

通常のREDOログと同様?、または、開けてびっくり?

▼ ダンプを眺めてみるのだ!!

抜粋-----------------------------------------------------------------

REDO RECORD - Thread:1 RBA: 0x000030.00000003.006c LEN: 0x017c 
VLD: 0x01
SCN: 0x0000.0007183d SUBSCN:  1 09/30/2007 03:49:24
-- ■REDO レコードヘッダ---------------------------------------------
CHANGE #1 TYP:0 CLS:25 AFN:2 DBA:0x00800049 OBJ:4294967295 
SCN:0x0000.0007183d SEQ:  1 OP:5.2
ktudh redo: slt: 0x0003 sqn: 0x00000000 flg: 0x0002 siz: 84 fbi: 0
            uba: 0x008000bc.0058.0b    pxid:  0x0000.000.00000000
-- ■ Change Vector 1  ----------------------------------------------
CHANGE #2 TYP:0 CLS:26 AFN:2 DBA:0x008000bc OBJ:4294967295 
SCN:0x0000.0007183d SEQ:  1 OP:5.1
ktudb redo: siz: 84 spc: 6690 flg: 0x0022 seq: 0x0058 rec: 0x0b
            xid:  0x0005.003.000000a2
ktubu redo: slt: 3 rci: 0 opc: 11.1 objn: 5611 objd: 5611 tsn: 0
Undo type:  Regular undo       Undo type:  Last buffer split:  No
Tablespace Undo:  No
             0x00000000
KDO undo record:
KTB Redo
op: 0x03  ver: 0x01
op: Z
KDO Op code: DRP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x00403372  hdba: 0x00403371
itli: 1  ispac: 0  maxfr: 4863
tabn: 0 slot: 0(0x0)
-- ■ Change Vector 2  ----------------------------------------------
CHANGE #3 TYP:0 CLS: 1 AFN:1 DBA:0x00403372 OBJ:5611 
SCN:0x0000.0007183d SEQ:  4 OP:11.2
KTB Redo
op: 0x01  ver: 0x01
op: F  xid:  0x0005.003.000000a2    uba: 0x008000bc.0058.0b
KDO Op code: IRP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x00403372  hdba: 0x00403371
itli: 1  ispac: 0  maxfr: 4863
tabn: 0 slot: 0(0x0) size/delt: 48
fb: --H-FL-- lb: 0x1  cc: 7
null: -------
col  0: [ 7]  35 2e 33 2e 31 36 32
col  1: [19]  30 39 2f 33 30 2f 32 30 30 37 20 30 33 3a 34 39 3a 32 34
col  2: [ 4]  c3 2f 32 3a
col  3: [ 1]  80
col  4: [ 2]  c1 02
col  5: [ 1]  80
col  6: [ 4]  c3 2f 32 3a
-- ■ Change Vector 3  ----------------------------------------------

抜粋-----------------------------------------------------------------

上記を見ると、通常のREDOログの構造と同様にREDOログヘッダーがあり、
その中に複数のチェンジベクターが含まれていることが確認できます。
※REDOログの構造、及びチェンジベクターついては以下で説明しております
のでご参照下さい。
https://old.insight-tec.com/mailmagazine/ora3/vol066.html

ディクショナリ情報が抽出されているというので特別なフォーマットかと思
いましたが、ダンプより確認した結果、REDOログの構造には変化がありませ
んでした。

どのようなオブジェクトに対してDMLが実行されているのかが気になります。
以下がREDOダンプから各オブジェクトへのDML実行回数を集計したものです。

OBJ#   :OBJ$.OBJ#列 例) Change Vector 3の「OBJ:5611」
NAME   :OBJ$.NAME列
DMLEXEC:REDOログダンプより集計


        OBJ#    NAME                  DMLEXEC
------------    --------------------- -------
           2    C_OBJ#                     23
           8    C_FILE#_BLOCK#             93
          18    OBJ$                       21
         482    MON_MODS$                  23
         483    I_MON_MODS$_OBJ            23
        5586    LOGMNRG_SEED$              17
        5587    LOGMNRG_DICTIONARY$         9
        5588    LOGMNRG_OBJ$              594
        5589    LOGMNRG_TAB$               41
        5590    LOGMNRG_COL$             2080
        5591    LOGMNRG_ATTRCOL$           24
        5592    LOGMNRG_TS$                 9
        5593    LOGMNRG_IND$               51
        5594    LOGMNRG_USER$               9
        5595    LOGMNRG_TABPART$            9
        5598    LOGMNRG_TYPE$              54
        5599    LOGMNRG_COLTYPE$           51
        5600    LOGMNRG_ATTRIBUTE$        254
        5601    LOGMNRG_LOB$                9
        5602    LOGMNRG_CDEF$             132
        5603    LOGMNRG_CCOL$             116
        5604    LOGMNRG_ICOL$              84
        5605    LOGMNRG_LOBFRAG$            9
        5606    LOGMNRG_INDPART$            9
        5611    LOGMNR_BUILDLOG             6
        5612    LOGMNR_BUILDLOG_PK          1

上記のとおり、ディクショナリ抽出の際には様々な表に対してDMLが実行され
ている事が確認できます。

次回は、ディクショナリ抽出の際にどのようなDML文が実行されているのかを
追求していきたいと思います。

今回はここまでです。

すっかり秋の気配を感じる 茅ヶ崎より