Oracle 11g検証 フラッシュバック・データ・アーカイブ その2

<Oracle 11g検証 フラッシュバック・データ・アーカイブ その2>
ペンネーム: オレンジみかん

今週も引き続きフラッシュバック・データ・アーカイブの検証を行います。

■前回のおさらい
▼フラッシュバック・データ・アーカイブ(以下、FDA)の概要
FDAとは、データベースに時間軸の概念を追加した機能です。
この機能によりリカバリ処理をすることなくテーブルの過去の状態
を参照することが出来ます。主な利用目的として監査ログ管理など
への利用が可能です。

[特徴]
FDAの特徴は以下のとおり
・データ操作の履歴管理が容易になった
・フラッシュバック問い合わせのSQL構文’AS OF’を利用した履歴データの
問い合わせをサポート
・レスポンスへの配慮
⇒フォアグラウンドで実行するSQLに配慮して履歴データは非同期で
書き込みをする。
・アプリケーションの作りこみが不要になった
⇒Oracleデータベースのシステムイベントとして履歴データを
取得するため、アプリケーションから見るとデータベースの一部と
して扱うことが出来るようになった。

それでは、実際にFDAを触ってみましょう。

■検証環境
Red Hat Enterprise Linux5 64bit
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0

■検証
▼検証環境の作成
まずはFDAを検証する環境を構築しましょう。

FDAの環境構築の流れは以下のとおりです。
(1)フラッシュバック・データ・アーカイブ領域の作成
(2)FDAの作成
(3)FDAの実行権限の設定
(4)対象テーブルをFDAの履歴管理対象として設定

(1)フラッシュバック・データ・アーカイブ領域の作成
FDAはレコード操作の履歴情報を管理するためレコード操作の履歴情報を
蓄積するための領域が必要になります。

そのため、以下のような手順でフラッシュバック・データ・アーカイブ領域
を作成します。
※SYSユーザーで操作

 SQL> --表領域の作成
 SQL> CREATE TABLESPACE FDA1_TS1 DATAFILE '/u01/app/oracle/oradata
 /insight/fda1_ts1.dbf' SIZE 1G;

  表領域が作成されました。

(2)FDAの作成
利用する表領域の一部を使ってFDA1という名前のFDAを作成します。

 SQL> CREATE FLASHBACK ARCHIVE FDA1 TABLESPACE FDA1_TS1 QUOTA 500M
  2   RETENTION 1YEAR;
   
 フラッシュバック・アーカイブが作成されました。

ここではオプションとして1年間の保存期間を設定してFDAの領域を作成
しました。

(3)FDAの実行権限の設定
実行ユーザーのSCOTTに対して履歴データ操作の利用権限を与えます。

 SQL> --権限の付与
 SQL> GRANT FLASHBACK ARCHIVE ON FDA1 TO SCOTT;

 権限付与が成功しました。

これでSCOTTが実行ユーザーとしてFDAを利用することが出来るようになり
ました。

(4)テーブルをFDAの履歴管理対象として設定
ここでは、EMP_MGRというテーブルを履歴対象に設定します。
※実行ユーザーで操作

 SQL> CREATE TABLE EMP_MGR AS SELECT * FROM EMP WHERE JOB='MANAGER';

 表が作成されました。

 SQL> SELECT * FROM EMP_MGR;

  EMPNO ENAME    JOB          MGR HIREDATE    SAL   COMM     DEPTNO
 ------ -------- --------- ------ -------- ------ ------ ----------
   7566 JONES    MANAGER     7839 81-04-02    810                20
   7698 BLAKE    MANAGER     7839 81-05-01   2850                30
   7782 CLARK    MANAGER     7839 81-06-09   2450                10

EMP_MGR表の履歴データを取得できるようにFDAを設定します。

 SQL> ALTER TABLE EMP_MGR FLASHBACK ARCHIVE FDA1;

 表が変更されました。

これでEMP_MGRというテーブルが履歴管理されるようになりました。

ちなみに、テーブルに履歴管理の設定がされているかどうかを確認するには
USER_FLASHBACK_ARCHIVE_TABLESを参照します。

 SQL> SELECT * FROM USER_FLASHBACK_ARCHIVE_TABLES;

 TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NA ARCHIVE_TABLE_NAME
 ---------- ---------- -------------------- --------------------
 EMP_MGR    SCOTT      FDA1                 SYS_FBA_HIST_70121

USER_FLASHBACK_ARCHIVE_TABLESにEMP_MGRというレコードが格納されている
ことからこのEMP_MGRテーブルが履歴管理されていることがわかります。

この後の過去レコードの参照確認のため、履歴データが作成された今の時刻
をOSのdateコマンド確認しておきましょう。

 $date
 2008年  11月  17日  月曜日 18:47:46 JST

▼過去レコードの参照
これで履歴データが蓄積されるようになりました。
実際に過去レコードを参照して確かめてみましょう。
今回の検証ではEMP_MGRテーブルのデータを削除後、削除前のデータを参照してみたい
と思います。

 SQL> --削除前のレコード
 SQL> SELECT * FROM EMP_MGR;

  EMPNO ENAME    JOB          MGR HIREDATE    SAL   COMM     DEPTNO
 ------ -------- --------- ------ -------- ------ ------ ----------
   7566 JONES    MANAGER     7839 81-04-02    810                20
   7698 BLAKE    MANAGER     7839 81-05-01   2850                30
   7782 CLARK    MANAGER     7839 81-06-09   2450                10

現在、EMP_MGRには3件のレコードが存在しています。

 SQL> --レコードの更新(全データの削除)
 SQL> DELETE FROM EMP_MGR;

 3行が削除されました。

 SQL> COMMIT;

 コミットが完了しました。

 SQL> SELECT * FROM EMP_MGR;

 レコードが選択されませんでした。
 

どこまで過去に遡れば良いか判断するため、過去レコードを参照する前に
履歴データ作成後からの経過時間を確認してみましょう。

現在の時刻をOSのdateコマンドで確認すると・・・

 $date
 2008年  11月  17日  月曜日 18:50:19 JST

先ほどの履歴データ作成から3分経過しているようです。

現時点で履歴データ作成から3分が経過していることから、データが存在して
いた5分前の状態を参照してみることにします。

FDAでの過去レコードの参照方法は以下になります。
[過去レコード参照時のSQL文]
SQL> SELECT [カラム名] FROM [テーブル名] AS OF [時間]

実はこの操作はフラッシュバック・クエリの場合と同じ操作です。

それでは、5分前のDELETE文実行前のデータを参照してみることにしましょう。

 SQL> --5分前のレコードを参照
 SQL> SELECT * FROM EMP_MGR
  2  AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '5' MINUTE);

  EMPNO ENAME    JOB          MGR HIREDATE    SAL   COMM     DEPTNO
 ------ -------- --------- ------ -------- ------ ------ ----------
   7566 JONES    MANAGER     7839 81-04-02    810                20
   7698 BLAKE    MANAGER     7839 81-05-01   2850                30
   7782 CLARK    MANAGER     7839 81-06-09   2450                10

 5分前の履歴データが参照出来ました。

このように、SELECT文にAS OF [時間] を追加するだけで簡単に過去データを
参照することができました。

では、既存フラッシュバック機能とFDAとの違いどんなものがあるの
でしょうか?

▼既存フラッシュバック機能とFDAの違い
以下に示す様に、履歴データの保存場所の違いから管理方法にに違いがあり
ます。

                           |履歴データの保存場所  |  保存期間
 --------------------------+----------------------+-----------------
 既存のフラッシュバック機能|UNDOデータ            |UNDOデータが上書き
                           |                      |されるまで
 --------------------------+----------------------+-----------------
 FDA                       |フラッシュバック・    |FDAで定義した期間
                           |データ・アーカイブ領域|(年単位で対応可能)
 --------------------------+----------------------------------------
 

既存のフラッシュバック機能ではUNDOデータを利用をするためトランザク
ションのコミット後に上書きされる可能性がありましたが、FDAでは保管場所
が別になったため、UNDOデータの管理方法を意識すること無く利用できる
ようになりました。これは一番大きな違いとなります。

今回はここまで
来週はFDAの特徴である履歴データの管理について検証します。

寒くてこの秋2回目の風邪をひきました。でも週末だけは元気です(爆)
恵比寿にて