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

投稿日: 2008年12月17日

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

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

■前回までのおさらい
前回ではFDAの運用管理ポイントとして、過去レコードの参照時における
INDEXの有効性について検証しました。今回も引き続きFDAの運用管理の
ポイントについて検証していきたいと思います。

FDAを運用する上で気になることは、監査対象となる表に対してFDAが長期に
わたって監査データを記録することによる記憶容量の増加です。この様に
FDAが増加する表領域に対してどの様な対処が必要なのでしょうか?

それでは障害が発生しうるケースを例にして対処方法を検証してみましょう。

■検証
[FDA障害復旧の検証]
先に記載した様に、過去レコードが長期にわたって蓄積されることでFDAに
設定した記憶容量が枯渇してしまうと履歴表に書き込みができないため、
ORACLEはFDA領域の障害として通知をします。

それでは、FDAの履歴表が満杯になるとどの様な障害が発生し、対処すれば
よいのでしょうか?
障害ケースを再現して記憶容量の障害に対する復旧方法に
ついて検証してみましょう。

□環境設定
FDAの記憶容量の枯渇を再現するため、FDAの記憶容量をできるだけ最小の
サイズに設定します。
以下の例では表領域のサイズを1GB、FDAの容量を1MBで設定しました。

SQL> --SYSユーザー
 SQL> CREATE TABLESPACE FDA1_TS1 DATAFILE
 2  '/APP/ORACLE/ORADATA/INSIGHT/FDA1_TS1.DBF'
 3   SIZE 1G;

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

 SQL> CREATE FLASHBACK ARCHIVE FDA1 TABLESPACE FDA1_TS1 QUOTA 1M
 2  RETENTION 1YEAR;

フラッシュバック・アーカイブが作成されました。

 SQL> GRANT FLASHBACK ARCHIVE ON FDA1 TO SCOTT;

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

□障害を発生させる
先ほどの環境設定でFDAの容量を1MBに設定しましたので、この容量を超える
過去レコードが履歴表に蓄積される様な操作を実行してみましょう。
今回の検証ではTEST1表を作成し、10万件のレコードを挿入してみます。

SQL> --検証用TABLEの作成
SQL> CREATE TABLE TEST1 (COL1 NUMBER(10));

表が作成されました。

SQL> --TEST1を履歴管理として設定
SQL> ALTER TABLE TEST1 FLASHBACK ARCHIVE FDA1;

表が変更されました。

SQL> --TEST1の履歴表を確認
SQL> SELECT ARCHIVE_TABLE_NAME FROM USER_FLASHBACK_ARCHIVE_TABLES;

ARCHIVE_TABLE_NAME
-----------------------------------------------------
SYS_FBA_HIST_73068

TEST1の履歴表を確認するとSYS_FBA_HIST_73068として作成されています。

それではFDA1に対して10万件のレコードを挿入して記憶領域の障害を
故意に発生してみましょう。

SQL> BEGIN
2    FOR I IN 1.. 100000 LOOP
3     INSERT INTO TEST1
4     (COL1
5     ) VALUES (I);
6     COMMIT;
7    END LOOP;
8   END;
9   /

BEGIN
*
行1でエラーが発生しました。:
ORA-55623:
フラッシュバック・アーカイブ"FDA1"がブロックしているため、すべての表
のトラッキングは一時停止されました
ORA-06512: 行3

□原因確認
それでは、障害原因を確認してみたいと思います。ORACLEのマニュアル
を確認するとORA-55623はフラッシュバック・アーカイブ表領域の領域が
不足が原因で発生しているようです。

===================================================================
  ORA-55623: フラッシュバック・アーカイブSTRINGがブロックしているため、
  すべての表のトラッキングは一時停止されました 
  原因: フラッシュバック・アーカイブ表領域の領域が不足しています。 
  処置: 表領域を追加するか、フラッシュバック・アーカイブの表領域の割当
        て領域を増やしてください。 
  ===============================================================
  ※参考文献:ORACLE DATABASEエラー・メッセージ 11G リリース1(11.1)
              E05746-01

この原因を考察するとテストケースとおりにFDAの確保する領域を超えたため、
データを履歴表に格納すると障害を検知して処理が停止したようです。

この障害の特徴として、FDAはINSERTの実行では履歴レコードが作成されない
にもかかわらず、Oracleは障害として検知していることが上げられます。
この動作から、Oracleは履歴表への過去レコードの蓄積容量を監視するだけ
ではなく履歴管理対象の表に対しても同様に監視をしているようです。

□FDAの領域障害の復旧
マニュアルにはFDAの表領域の割り当てを増やすように記載があるので、早速
FDAの表領域の割り当てをしたいと思います。

FDAの表領域に関する情報をDBA_FLASHBACK_ARCHIVE_TSで確認すると、障害発生
時のFDAの容量は1Mであることが確認できます。

SQL> --設定の内容確認
SQL> SELECT FLASHBACK_ARCHIVE_NAME,QUOTA_IN_MB,TABLESPACE_NAME FROM
2    DBA_FLASHBACK_ARCHIVE_TS;

FLASHBACK_ QUOTA_IN_M TABLESPACE_NAME
---------- ---------- ------------------------------
FDA1                1 FDA1_TS1

せっかくなのでFDA1には表領域FDA1_TS1を利用してFDAの容量を無制限で割り
当ててみましょう。FDAへの表領域の容量の割り当ては
ALTER FLASHBACK ARCHIVE [FDA名] MODIFY TABLESPACE [表領域名]
QUOTA [サイズ]
になります。このコマンドでサイズをUNLIMITEDに指定できるのでしょうか?

SQL> ALTER FLASHBACK ARCHIVE FDA1 MODIFY TABLESPACE FDA1_TS1 QUOTA
 2  UNLIMITED;
ALTER FLASHBACK ARCHIVE FDA1 MODIFY TABLESPACE FDA1_TS1 QUOTA UNLIMITED
                                                              *

 行1でエラーが発生しました。:
 ORA-55603: フラッシュバック・アーカイブ・コマンドが無効です

あら!? 怒られてしまいました。
実はQUOTAの指定のデフォルト値はUNLIMITEDですので、QUOTAを指定しない形
で再設定してみます。

SQL> ALTER FLASHBACK ARCHIVE FDA1 MODIFY TABLESPACE FDA1_TS1;

フラッシュバック・アーカイブが変更されました。

SQL> --設定変更後の内容確認
SQL> SELECT FLASHBACK_ARCHIVE_NAME,QUOTA_IN_MB,TABLESPACE_NAME FROM
2  DBA_FLASHBACK_ARCHIVE_TS;

FLASHBACK_ QUOTA_IN_M TABLESPACE_NAME
---------- ---------- ------------------------------
FDA1                  FDA1_TS1

QUOTA_IN_MカラムがNULL値になりFDA1の容量がUNLIMITEDになりました。

□復旧後のFDAの動作確認
先ほどの障害時に発生したデータを削除後、再度FDAにデータを投入すると
以下のように障害無くデータがTEST1表へ格納できました。

SQL> --前回の投入レコードを削除
SQL> DELETE FROM TEST1;

3672行が削除されました。

SQL> COMMIT;

SQL> --前回の履歴表のデータ削除
SQL>  ALTER FLASHBACK ARCHIVE FDA1 PURGE ALL;

フラッシュバック・アーカイブが変更されました。

SQL>    BEGIN
 2      FOR I IN 1.. 100000 LOOP
 3       INSERT INTO TEST1
 4       (COL1
 5       ) VALUES (I);
 6       COMMIT;
 7      END LOOP;
 8     END;
 9     /

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

内容を確認して見ましょう。

SQL> SELECT COUNT(*) FROM TEST1;

  COUNT(*)
----------
    100000

それではDELETEを実行して履歴表に過去レコードを正常に格納されるのか
確認してみましょう。

SQL> DELETE FROM TEST1;

100000行が削除されました。

SQL>COMMIT;

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

TEST1の履歴表(SYS_FBA_HIST_73068)を確認すると、5分後に10万件の
レコードが作成されました。

SQL> SELECT COUNT(*) FROM SYS_FBA_HIST_73068;

  COUNT(*)
----------
         0

SQL> SELECT COUNT(*) FROM SYS_FBA_HIST_73068;

  COUNT(*)
----------
    100000

履歴表も10万件作成されており正常に動作ができるようになりました。

以上の様に、FDAの領域不足による障害はFDAの容量を1MBからUNLIMITED
(無制限)に再設定をすることで復旧することができました。

実際にFDAの領域障害に対して復旧操作をしてみると、FDAの容量制限をした
場合では、FDAの容量制限と表領域容量制限の二つで管理することとなり管理
が複雑になりがちであることがわかりました。そこで、FDAの構成が一つに対
して表領域を対応それぞれ対応させる構成を考えるとFDAの領域制限は表領域
ごとにCREATE TABLESPACE文のQUOTA句で指定することが可能であることから、
FDAはデフォルトのUNLIMITEDに設定して表領域で領域容量を管理する方が非常
にシンプルであり管理が容易になると考えられます。

■まとめ
以上の6回の検証にわたりFDAの検証を行ってきました。
「特定の表に対して操作履歴を長期的に取りたい!!」というシーンでは設定
が比較的容易である点、フロントサイドで動作するSQLと非同期で操作してい
る点を見るとFDAは有効な手段であることがわかりました。
また、賢く運用するにはFDAは過去レコードの蓄積により記憶容量を多く消費
することから表領域の管理の工夫がポイントになりそうです。

[FDA利用のポイント例]
・FDAの履歴表は通常では頻繁に参照するシーンが少ないことが想定されるた
め、特定の参照する時にだけINDEXを作成する。

・記憶領域のコストを 抑える必要がある場合は、高性能で高価なストレージ
システムだけではなく、市場に流通しているSATAなどの様な安価なもの
も、データの保護レベルに応じて検討する。

以上の様に、システム運用の工夫のポイントを考えるとシステム構築・運用
ではプロダクトの機能/性能だけが向上するだけではなく、使う我々も賢く
工夫していくことが勿論重要であると改めて感じました。

今回でフラッシュバック・データ・アーカイブの検証は終わりです。
次の連載でまたお会いしましょう。

次回からは新しいシリーズとしてASMLIBの検証が始まります。

気づいたら、もう2008年が終わってしまった!! 早すぎる~ 恵比寿にて