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

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

皆様、始めまして。
最近ちょっとメタボリックな”ぽっちゃりメタボン”と申します。
今週から約8回に渡り、ログマイナーについての検証をじっくり行っていき
たいと思っていますのでどうぞ、お付き合い宜しくお願い致します。

▼ はじめに

通常ログマイナーというと、データリカバリのための情報として
使われている方も多いのでないかと思います。
# 以前、当メルマガでログマイナーを取り上げた際にも、
データリカバリにフォーカスした検証を行っております。
https://www.insight-tec.com/mailmagazine/ora3/vol080.html

では、まず最初に、一般的なログマイナーの説明を(教科書的で申し訳ない
ですが)書いておきます。

・論理的な破損の特定。
・アプリケーション・レベルで発生したエラーなど、
データベースの論理的破損が発生した時期を特定。
・リカバリを行うための処置を特定。
・リカバリを行うために必要なSQLを特定。
・傾向分析
・どの表にどんな更新が多いかなどの統計情報を取得し、
チューニング時の優先順位を決定することができる。

などなどが、一般的な説明になるかと思います。

しかしながら、
昨今、データベースにまつわるセキュリティの話が盛り上がっており、時折
お客様より、データの更新/削除処理の内容を監査できないか?(これを巷では
データ・チェンジ・コントロールといったりします)
などと言ったお話しを頂戴することがあります。実際このような要件に対応
するためには、アプリケーション側でデータの更新/削除をログとしてどこ
かのテーブルに吐き出す等の作り込みが必要になってきます。

ところが、どっこい。

Oracleには皆様ご存知のREDOログという更新前後のデータを保持するファイ
ルがあるではあーりませんか。このREDOログファイルをばっちり分析できれ
ば上記要件もアプリ改修いらずで可能になるかもしれません。

そこで登場するのが今回検証をしていくログマイナーです。ログマイナーは
オンラインREDOログ、アーカイブREODログを分析するためのツールですので
、ログマイナーを使ってデータ・チェンジ・コントロールを実現してみよう
と思います。

ただし、ログマイナー自身はただのツールに過ぎないので、このツールがど
のようにしてREDOログを分析しているのか、徹底的にまる裸にしてやろうと
いうのが今回の裏ミッションとなります。

というわけで、本シリーズの話の流れを簡単に以下に書いてみます。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. 環境構築やらいろいろ

2. ログマイナーでできることって何だろう?
(本当にデータ・チェンジ・コントロールに使えるの?)

3. ログマイナーの良い点、悪い点って何だろう?
(ログマイナーを適用すると効果的な場合と
効果的でない場合って何だろう?)

4. Audit Vaultではどうやって更新ログを採取してるのか
検証してみちゃう。

5. ログマイナーが動作する仕様を検証してみよう。

6. まとめ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
このような感じで検証を進めていきたいと思っています。

▼ ログマイナーを起動してみるのだ

では早速、今回使用する検証環境の構築からはじめていきたいと思います。
今回の検証で使用した環境は以下のとおり。

◆環境

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

さて、さて。

まず、ログマイナーを使用するには最低限、最小サプリメンタル・ロギングを
有効にしなさいとマニュアルに記述がありますので実施してみます。

# まずは現在の状態を確認してみましょう。
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEMENTAL_LOG_DATA_MIN
------------------------------
NO

# 10gR2のデフォルトでは無効になっているようですので変更します。
SQL> alter database add supplemental log data;

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


# 実際に変更されたか確認。
SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEMENTAL_LOG_DATA_MIN
------------------------------
YES


# 分析対象とするREDOログファイルを指定します。
# ※今回はオンラインREDOログを指定。
SQL> execute dbms_logmnr.add_logfile(logfilename => -
> '/home/ora102/oracle/oradata/ora102/redo01.log' -
> ,options => dbms_logmnr.new);

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


# ログマイナー起動!! とぉ!!
SQL> execute dbms_logmnr.start_logmnr(options => -
> dbms_logmnr.dict_from_online_catalog);

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


# では REDOログの中身がどんな風に見えるのでしょうか。
# ※事前に表TEST_1に対してupdate文を実行済み。
SQL> select SCN,TIMESTAMP,TABLE_NAME,OPERATION,SQL_REDO from
> v$logmnr_contents where operation!='INTERNAL' 
> and seg_name like '%TEST%'


       SCN TIMESTAM TABLE_NAME OPERATION
---------- -------- ---------- ----------
    428474 07-09-25 TEST_1     UPDATE

SQL_REDO
-------------------------------------------------------------------
update "SCOTT"."TEST_1" set "COL2" = 'data5' where "COL2" = 'data5' 
and ROWID = 'AAACvbAAEAAAAh9AAE';

以外にあっさり、REDOログの内容が確認可能のようです。
前回(8i,9i)のおさらいも兼ねて
10gR2でのログマイナー実行手順をさらっと確認しましたが
ログマイナーの実行オプションなどの違いなども
確認しつつ今後はご紹介できればと思います。

次回はこれらの情報も含めて「ログマイナーでできることって何だろう?」
をさらに探っていきます。
今後は、ログマイナーを極めてやろうと意気込んでますので乞うご期待を。

今回は、これでおしまいです。

サウナの後のビールがうまい 茅ヶ崎より