Oracle フラッシュバック・データ・アーカイブ

  • Oracle
  • RDS
  • RDS Oracle にて、フラッシュバック・データ・アーカイブという機能を使う機会があったのですが、とても素晴らしい機能でしたので、今回は記事にしたいと思います。

    フラッシュバック・データ・アーカイブとは

    簡潔に言いますと『過去の特定の時点におけるテーブルのデータを参照できる』という機能です。

    UNDOデータよりも長い期間(例えば1年とか2年とか)履歴データを保存することが出来るため、SOX法などの監査要件に対して大変有効な機能です。

    この機能は他のデータベースにはその割っていない、Oracle にしかない機能です。

    イメージ図

    oracle-flashback-archive

    フラッシュバック・データ・アーカイブの設定方法

    通常の USER 表領域に作っていた Table_A に対して、過去1年間の履歴を保持しておくようフラッシュバック・データ・アーカイブを設定します。

    設定方法はいたって簡単です。さっそく、見ていきましょう。

    ① フラッシュバック・データ・アーカイブ用の表領域 FDA を作成します。

    SQL> CREATE TABLESPACE FDA DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 10G;

    ② フラッシュバック・データ・アーカイブ FDA1 を表領域 FDA に割り当てます。最大1Gの FGA 表領域を使用し、1年間の履歴を保持するよう設定しています。

    SQL> CREATE FLASHBACK ARCHIVE FDA1 TABLESPACE FDA1 QUOTA 1G RETENTION 1 YEAR;

    ③ Table_A に対してフラッシュバック・データ・アーカイブ FDA1 を割り当てます。

    SQL> ALTER TABLE Table_A FLASHBACK ARCHIVE FDA1;

    なんと、設定はこれで完了です。実に簡単ですね。

    過去のデータを参照してみましょう。

    まずは、今のデータを見てみます。

    SQL> select * from Table_A order by 1; EMPNO ENAME JOB MGR ---------- ---------- --------- ---------- 1 koizumi sales 7 2 sasaki technic 10

    新たにデータを挿入して、そのまま参照します。

    SQL> insert into Table_A values(0003,'suzuki01','soccer',0999); SQL> select * from Table_A order by 1; EMPNO ENAME JOB MGR ---------- ---------- --------- ---------- 1 koizumi sales 7 2 sasaki technic 10 3 suzuki01 soccer 999

    では、フラッシュバック・データ・アーカイブによって保持している過去の履歴データを参照してみましょう。

    構文は AS OF 句です。

    SQL> -- 20分前の状態を参照 SQL> select * from Table_A AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '20' MINUTE); EMPNO ENAME JOB MGR ---------- ---------- --------- ---------- 1 koizumi sales 7 2 sasaki technic 10 SQL> SQL> -- 特定時刻'2020-06-10 08:07:00'のデータを参照(前日の履歴を参照) SQL> SELECT * FROM Table_A AS OF TIMESTAMP TO_TIMESTAMP ('2020-06-10 08:07:00', 'YYYY-MM-DD HH24:MI:SS'); EMPNO ENAME JOB MGR ---------- ---------- --------- ---------- 1 koizumi sales 7 2 sasaki technic 10

    これだけでも十分、すごい機能だと思いませんか?

    さらに、こんな使い方も

    INSERT INTO Table_B SELECT * FROM Table_A AS OF TIMESTAMP TO_TIMESTAMP ('2020-06-10 08:07:00', 'YYYY-MM-DD HH24:MI:SS');

    過去の特定の時刻のデータを、INSERT SELECT * することも出来てしまいます。

    これを利用すれば、過去のある時点の状態にテーブルを戻して、アプリケーションからクエリを実行すれば、当時どのようなデータを参照していたのか調べることが出来ます。

    セキュリティインシデントが発生した際の調査で活躍しそうな機能ですね~。

    フラッシュバック・データ・アーカイブの制約

    ただし、フラッシュバック・データ・アーカイブを使用するためには制約があります。ここで、いくつか紹介しておきます。

    詳しくは、公式ドキュメントを参照してください。

    ① 対象のテーブルの列名に、下記の名前はフラッシュバック・データ・アーカイブ予約語であるため、使用不可です。

    • STARTSCN
    • ENDSCN
    • RID
    • XID
    • OP
    • OPERATION

    ※完全一致だと、ORA-ERROR で弾かれます。"RID01" などの列名であれば問題ありません。

    ② 表にLONG列があると、フラッシュバック・データ・アーカイブを使用できません。

    ③ フラッシュバック・データ・アーカイブが設定されたテーブルでは、パーティションまたはサブパーティションを移動、分割、マージまたは結合が出来ません。

    ④ フラッシュバック・データ・アーカイブが設定されたテーブルでは、DROP TABLE が使用できません。フラッシュバック・データ・アーカイブを解除すれば、DROP TABLE は使用可能です。

    最後にもう一つ、懸念点

    設定するためには RDS のストレージに直接、新しくフラッシュバック・データ・アーカイブ用の表領域を作りますので、予め容量を見積もっておく必要があります。

    フラッシュバック・データ・アーカイブがどれくらいのストレージを使用するのか、今回は調査できておりません。

    しかしながら、フラッシュバック・データ・アーカイブの機能そのものは優秀ですよね。

    今回は以上です。

  • Oracle
  • RDS