ヘッダーをスキップ
Oracle Databaseアドバンスト・アプリケーション開発者ガイド
11gリリース1(11.1)
E05687-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

13 Oracle Flashback Technologyの使用

この章では、データベース・アプリケーションにおけるOracle Flashback Technologyの使用について説明します。

内容は次のとおりです。

Oracle Flashback Technologyの概要

Oracle Flashback TechnologyとはOracle Database機能のグループの1つであり、Point-in-Timeメディア・リカバリを使用しなくても、データベース・オブジェクトの過去の状態を表示したり、データベース・オブジェクトを前の状態に戻すことができます。

フラッシュバック機能を使用すると、次のことができます。

Oracle Flashback機能では、自動UNDO管理(AUM)システムにより、トランザクションに関するメタデータおよび履歴データが取得されます。フラッシュバック機能はUNDOデータに依存します。UNDOデータは、個々のトランザクションの結果のレコードです。たとえば、ユーザーが給与を1000から1100に変更するUPDATE文を実行すると、Oracle DatabaseによってUNDOデータに値1000が格納されます。

UNDOデータは永続的であり、データベース停止時にも失われません。フラッシュバック機能を使用すると、UNDOデータを使用して過去のデータを問い合せたり、論理的な損害をリカバリしたりすることができます。UNDOデータは、フラッシュバック機能以外でも、Oracle Databaseによって次の処理に使用されます。

内容は次のとおりです。

フラッシュバック機能の詳細は、『Oracle Database概要』を参照してください。

アプリケーション開発機能

アプリケーション開発では、次のフラッシュバック機能を使用して、履歴データに関するレポートを作成したり、誤った変更を元に戻すことができます。(この機能は、データベース・ユーザーまたは管理者として対話形式でも使用できます。)

Oracle Flashback Query

この機能を使用して、SELECT文のAS OF句で指定した過去のある時点のデータを取得できます。詳細は、「Oracle Flashback Query(SELECT AS OF)の使用」を参照してください。

Oracle Flashback Version Query

この機能を使用して、特定の時間間隔内のメタデータおよび履歴データを取得します(たとえば、ある表の、特定の時間間隔内に存在していたすべての行を表示します)。各行バージョンに関するメタデータには、開始時間と終了時間、変更処理のタイプおよび行バージョンを作成したトランザクションの識別情報が含まれます。Oracle Flashback Version Queryを作成するには、SELECT文でVERSIONS BETWEEN句を使用します。詳細は、「Oracle Flashback Version Queryの使用」を参照してください。

フラッシュバック・トランザクション問合せ

この機能を使用して、特定の時間間隔内における特定のトランザクションまたはすべてのトランザクションのメタデータおよび履歴データを取得できます。Oracle Flashback Transaction Queryを実行するには、静的データ・ディクショナリ・ビューFLASHBACK_TRANSACTION_QUERYから選択します。詳細は、「Oracle Flashback Transaction Queryの使用」を参照してください。

通常、Oracle Flashback Transaction Queryは、対象となる行のトランザクションIDを戻すOracle Flashback Version Queryと併用します(「Oracle Flashback Transaction QueryとOracle Flashback Version Queryの併用」を参照してください)。

DBMS_FLASHBACKパッケージ

この機能は、ある時点の最新データを検査できるよう、Oracle Database内部の時計を過去のある時点まで戻す場合、あるいはデータベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックする場合に使用できます(「フラッシュバック・トランザクション」を参照してください)。詳細は、「DBMS_FLASHBACKパッケージの使用」を参照してください。

フラッシュバック・トランザクション

フラッシュバック・トランザクションは、データベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックする場合に使用します。このリカバリ操作では、UNDOデータを使用して対応する補正トランザクションを作成および実行します。このトランザクションによって影響のあったデータが元の状態に戻ります。(フラッシュバック・トランザクションは、DBMS_FLASHBACKパッケージの一部です。)詳細は、「DBMS_FLASHBACKパッケージの使用」を参照してください。

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

フラッシュバック・データ・アーカイブを使用して、通常の問合せとOracle Flashback Queryを自動的に追跡およびアーカイブし、スナップショットが古すぎるというエラーが発生することなくデータベース・オブジェクトの各バージョンへのSQLレベルのアクセスを保証します。詳細は、「フラッシュバック・データ・アーカイブの使用(Oracle Total Recall)」を参照してください。

データベース管理機能

次のフラッシュバック機能は、主としてデータ・リカバリ用です。通常、この機能は、データベース管理者としてのみ使用します。

この章では、アプリケーション開発機能に重点を置いています。データベース管理機能の詳細は、『Oracle Database管理者ガイド』および『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください。

Oracle Flashback Table

表の状態を以前の特定の時点までリカバリする場合に、この機能を使用します。データベースがオンラインの間は表のリストアが可能であり、指定した表に対する変更のみ元に戻すことができます。

Oracle Flashback Drop

削除された表をリカバリする場合に、この機能を使用します。この機能によって、DROP TABLE文の影響が無効になります。

Oracle Flashback Database

以前の特定の時点からのすべての変更を元に戻し、データベースをその時点まで迅速に戻す場合に、この機能を使用します。データベースのバックアップをリストアする必要がないため、処理が高速です。

Oracle Flashback Technologyに関するデータベースの構成

アプリケーションでフラッシュバック機能を使用するには、まず、ユーザーまたはデータベース管理者は次の各項で説明する構成タスクを実行する必要があります。

自動UNDO管理に関するデータベースの構成

自動UNDO管理(AUM)に関してデータベースを構成するには、ユーザーまたはデータベース管理者は次を実行する必要があります。

  • フラッシュバック操作に必要なデータを保持するために十分な領域を持つUNDO表領域を作成します。

    データの更新回数が増加するほど、より多くの領域が必要になります。データベース管理者は通常、必要な領域を計算します。

  • 『Oracle Database管理者ガイド』の説明に従ってAUMを有効にします。次のデータベース初期化パラメータを設定します。

    • UNDO_MANAGEMENT

    • UNDO_TABLESPACE

    • UNDO_RETENTION

    固定サイズのUNDO表領域の場合、Oracle Databaseでは自動的にシステムを調整して、UNDO表領域に最適なUNDOを保持します。

    自動的に拡張可能なUNDO領域の場合、Oracle Databaseでは、最長の問合せ期間よりも長いUNDOデータ、およびUNDO_RETENTIONパラメータで指定されたUNDO保持の低いしきい値が保持されます。


    注意:

    V$UNDOSTAT.TUNED_UNDORETENTIONを問い合せて、現在のUNDO表領域に対してUNDOが保持される期間を決定できます。

    UNDO_RETENTIONの設定は、期限切れになっていないUNDOデータが廃棄されないことを保証するものではありません。システムの領域が不十分な場合、Oracle Databaseでは期限切れになっていないUNDOが新しく生成されたUNDOによって上書きされる場合があります。

  • UNDO表領域に対しRETENTION GUARANTEE句を指定して、期限切れになっていないUNDOデータが廃棄されないようにします。


関連項目:

UNDO表領域の作成とAUMの有効化の詳細は、『Oracle Database管理者ガイド』を参照してください。

Oracle Flashback Transaction Queryに関するデータベースの構成

Oracle Flashback Transaction Query機能についてデータベースを構成するには、ユーザーまたはデータベース管理者は次を実行する必要があります。

  • Oracle Databaseがバージョン10.0と互換性があることを確認します。

  • サプリメンタル・ロギングを有効にします。

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
    

フラッシュバック・トランザクションに関するデータベースの構成

フラッシュバック・トランザクション機能についてデータベースを構成するには、ユーザーまたはデータベース管理者は次を実行する必要があります。

  • データベースがマウントされているが、開かれていない状態で、ARCHIVELOGを有効にします。

    ALTER DATABASE ARCHIVELOG;
    
  • 1つ以上のアーカイブ・ログを開きます。

    ALTER SYSTEM ARCHIVE LOG CURRENT;
    
  • サプリメンタル・ロギングが有効になっていない場合、これを有効にします。

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
    

特定のLOB列に対するOracle Flashback操作の有効化

表の特定のLOB列に対するフラッシュバック操作を可能にするには、ALTER TABLE文をRETENTIONオプションとともに使用します。

LOB列のUNDOデータは膨大になる場合があるため、フラッシュバック操作で使用するLOB列を定義する必要があります。


関連項目:

LOB記憶域およびRETENTIONパラメータの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

必要な権限の付与

ユーザーまたはデータベース管理者は、次のフラッシュバック機能を使用する必要があるユーザー、ロールまたはアプリケーションに対して権限を付与する必要があります。GRANT文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

Oracle Flashback QueryおよびOracle Flashback Version Query

次のいずれかを実行します。

  • 問合せ中に特定のオブジェクトへのアクセスを許可するには、そのオブジェクトに関するFLASHBACKおよびSELECT権限を付与します。

  • すべての表に対する問合せを許可するには、FLASHBACK ANY TABLE権限を付与します。

Oracle Flashback Transaction Query

SELECT ANY TRANSACTION権限を付与します。

Oracle Flashback Transaction Queryによって取得したUNDO SQLコードの実行を許可するには、特定の表に対するSELECTUPDATEDELETEおよびINSERT権限を付与します。

DBMS_FLASHBACKパッケージ

DBMS_FLASHBACKパッケージの機能にアクセスできるようにするには、DBMS_FLASHBACKに対するEXECUTE権限を付与します。

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

特定のユーザーが特定のフラッシュバック・データ・アーカイブを使用してデータ・アーカイブを表にフラッシュバックできるようにするには、フラッシュバック・データ・アーカイブに対するFLASHBACK ARCHIVEオブジェクト権限をそのユーザーに付与します。FLASHBACK ARCHIVEオブジェクト権限を付与するには、SYSDBAとしてログオンしているか、FLASHBACK ARCHIVE ADMINISTERシステム権限が必要です。

次の文の実行を許可するには、FLASHBACK ARCHIVE ADMINISTERシステム権限を付与します。

  • CREATE FLASHBACK ARCHIVE

  • ALTER FLASHBACK ARCHIVE

  • DROP FLASHBACK ARCHIVE

FLASHBACK ARCHIVE ADMINISTERシステム権限を付与するには、SYSDBAとしてログオンしている必要があります。

CREATE FLASHBACK ARCHIVE文またはALTER FLASHBACK ARCHIVE文を使用して、デフォルトのフラッシュバック・データ・アーカイブを作成するには、SYSDBAとしてログオンしている必要があります。

フラッシュバック・データ・アーカイブで有効にされている表のフラッシュバック・データ・アーカイブを無効にするには、SYSDBAとしてログオンしているか、FLASHBACK ARCHIVE ADMINISTERシステム権限が必要です。

Oracle Flashback Query(SELECT AS OF)の使用

Oracle Flashback Queryを使用するには、SELECT文でAS OF句を使用します。Oracle Flashback Queryにより、過去のある時点で存在していたデータを取得できます。問合せでは、タイムスタンプまたはシステム変更番号(SCN)を使用することで、過去の時点が明示的に参照されます。その時点で最新であったコミット済データが戻されます。

Oracle Flashback Queryは、次のような場合に使用します。

内容は次のとおりです。

SELECT AS OF文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

過去のデータの検査およびリストアの例

たとえば、午後12時30分に従業員Chungの行がemployee表から削除されていることに気付き、午前9時30分にはこのデータがデータベース内に正しく格納されていたことを知っているとします。この場合、Oracle Flashback Queryを使用して午前9時30分の表の内容を調べ、失われたデータを見つけることができます。必要に応じて失われたデータをリストアできます。

例13-1では、2004年4月4日午前9時30分におけるChungのレコードの状態が取得されます。

例13-1 Oracle Flashback Queryを使用した失われた行の取得

SELECT * FROM employees
  AS OF TIMESTAMP
   TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
     WHERE last_name = 'Chung';

例13-2では、Chungの情報がemployees表にリストアされます。

例13-2 Oracle Flashback Query後の失われた行のリストア

INSERT INTO employees
  (SELECT * FROM employees
     AS OF TIMESTAMP
       TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')
         WHERE last_name = 'Chung');

Oracle Flashback Queryのガイドライン

  • 各表に対してAS OF句を指定または省略できます。また、異なる表に異なる時間を指定できます。

  • 問合せでAS OF句を使用すると、Oracle Flashback Queryと同じセッションで表の作成、切捨てなどのDDL操作または挿入、削除などのDML操作を実行できます。

  • Oracle Flashback Queryの結果を、データベースの現在の状態に影響するDDL文またはDML文内で使用するには、INSERT文またはCREATE TABLE AS SELECT文内でAS OF句を使用します。

  • 3秒の違い(最大)がアプリケーションにおけるOracle Flashback Queryで重要となる場合、タイムスタンプではなくSCNを使用します。「Oracle Flashback Technologyの一般ガイドライン」を参照してください。

  • ビューを定義するSELECT文のAS OF句を使用して、過去のデータを参照するビューを作成できます。

    データベース・ホストの現在の時間から引いて相対時間を指定すると、過去の時間が各問合せで再計算されます。次に例を示します。

    CREATE VIEW hour_ago AS
      SELECT * FROM employees
         AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);
    

    SYSTIMESTAMPは、データベース・ホスト環境のタイムゾーンを参照します。

  • 自己結合または集合演算(INTERSECTMINUSなど)のAS OF句は、2つの異なる時間のデータを抽出または比較するために使用できます。

    Oracle Flashback Queryの前にCREATE TABLE AS SELECT文またはINSERT INTO TABLE SELECT文を使用すると、結果を格納できます。たとえば、次の問合せでは、1時間前に存在していた行がemployees表に再挿入されます。

    INSERT INTO employees
        (SELECT * FROM employees
         AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE)
        )
        MINUS SELECT * FROM employees);
    

    SYSTIMESTAMPは、データベース・ホスト環境のタイムゾーンを参照します。

Oracle Flashback Version Queryの使用

特定の時間間隔内に存在していた、特定の行の様々なバージョンを取得するには、Oracle Flashback Version Queryを使用します。COMMIT文が実行されると、そのたびに新しい行バージョンが作成されます。

SELECT文でVERSIONS BETWEEN句を使用して、Oracle Flashback Version Queryを指定します。構文は次のとおりです。

VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end}

ここで、startおよびendはそれぞれ、問合せ対象の時間間隔の開始点と終了点を表す式です。時間間隔にはstartおよびendが含まれます。

Oracle Flashback Version Queryでは、特定の行について、指定した時間間隔内に存在していたすべてのバージョンの各1行を含む表が戻されます。表の各行には、行バージョンに関するメタデータの疑似列が含まれます。これについては表13-1で説明しています。この情報により、特定の変更(誤った変更など)がデータベースにいつ、どのように加えられたかがわかります。

表13-1 Oracle Flashback Version Queryにおける行データ疑似列

疑似列名 説明

VERSIONS_STARTSCN

VERSIONS_STARTTIME

行バージョンが作成されたときの開始システム変更番号(SCN)またはTIMESTAMP。この疑似列によって、データの値が最初に行バージョンに反映された時間が識別されます。この疑似列を使用して、Oracle Flashback TableまたはOracle Flashback Queryにおける過去のターゲット時間を指定できます。

この疑似列がNULLの場合、その行バージョンは、startより前に作成されています。

VERSIONS_ENDSCN

VERSIONS_ENDTIME

行バージョンが期限切れとなったときのSCNまたはTIMESTAMP

この疑似列がNULLの場合、問合せの時点で行バージョンが最新であったか、またはその行がDELETE操作に対応しています。

VERSIONS_XID

その行バージョンが作成されたトランザクションの識別子。

VERSIONS_OPERATION

トランザクションにより実行された操作。Iは挿入、Dは削除、Uは更新を表します。バージョンは、挿入、削除または更新された行のバージョンです。つまり、INSERT操作後の行、DELETE操作前の行、またはUPDATE操作の影響を受ける行です。

ユーザーによる索引キーの更新の場合、Oracle Flashback Version Queryでは、UPDATE操作がDELETEおよびINSERTの2つの操作として処理される場合があり、Dの後にIVERSIONS_OPERATIONが続く、2つのバージョンの行で表されます。


指定された行バージョンは、VERSIONS_START*の時間からVERSIONS_END*の時間(ただしこの時間は含まれない)まで有効です。つまり、VERSIONS_START* <= t < VERSIONS_END*である場合、時間tではいつでも有効です。たとえば、次の出力は、2002年9月9日(この日付を含む)から2003年11月25日(この日付は含まない)まで、給与が10243であったことを示します。

VERSIONS_START_TIME     VERSIONS_END_TIME     SALARY
-------------------     -----------------     ------
09-SEP-2003             25-NOV-2003           10243

次に、Oracle Flashback Version Queryの一般的な使用方法を示します。

SELECT versions_startscn, versions_starttime,
       versions_endscn, versions_endtime,
       versions_xid, versions_operation,
       name, salary
  FROM employees
  VERSIONS BETWEEN TIMESTAMP
      TO_TIMESTAMP('2003-07-18 14:00:00', 'YYYY-MM-DD HH24:MI:SS')
  AND TO_TIMESTAMP('2003-07-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS')
  WHERE name = 'JOE';

Oracle Flashback Transaction QueryでVERSIONS_XIDを使用して、行の変更を元に戻すために必要なSQLおよびその変更の担当ユーザーなど、このトランザクションのメタデータを検索できます。「Oracle Flashback Transaction Queryの使用」を参照してください。


関連項目:

Oracle Flashback Version Queryの疑似列、およびVERSIONS句の構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

Oracle Flashback Transaction Queryの使用

Oracle Flashback Transaction Queryを使用して、特定の時間間隔内における特定のトランザクションまたはすべてのトランザクションのメタデータおよび履歴データを取得できます。Oracle Flashback Transaction Queryは、静的データ・ディクショナリ・ビューFLASHBACK_TRANSACTION_QUERYの問合せを行います。この表の列の詳細は、『Oracle Databaseリファレンス』を参照してください。

UNDO_SQLには、トランザクションで実行されたDML操作の論理的に逆の操作となるSQLコードがあります。通常、このコードを使用して、トランザクション中に実行された論理手順を元に戻すことができます。ただし、SQL_UNDOのコードが、元のトランザクションの厳密な逆操作ではない場合があります。たとえば、SQL_UNDO INSERT操作で表に行を戻す場合、その行が削除された行と同じROWIDではないことがあります。

次の文では、トランザクションID、操作、操作の開始SCNおよび終了SCN、操作の担当ユーザー、および操作の論理的な逆操作を示すSQLコードなどのトランザクション情報について、FLASHBACK_TRANSACTION_QUERYビューを問い合せています。

SELECT xid, operation, start_scn, commit_scn, logon_user, undo_sql
  FROM flashback_transaction_query
    WHERE xid = HEXTORAW('000200030000002D');

次の文では、Oracle Flashback Version Queryを副問合せとして使用し、各行バージョンを、行データの変更を担当するLOGON_USERに関連付けています。

SELECT xid, logon_user
  FROM flashback_transaction_query
    WHERE xid IN (
      SELECT versions_xid FROM employees VERSIONS BETWEEN TIMESTAMP
        TO_TIMESTAMP('2003-07-18 14:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
          TO_TIMESTAMP('2003-07-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS')
    );

関連項目:

  • データベース管理者がフラッシュバック表を使用して、個々の行ではなく表全体をリストアする方法の詳細は、『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください。

  • データベース管理者がフラッシュバック表を使用して、個々の行ではなく表全体をリストアする方法の詳細は、『Oracle Database管理者ガイド』を参照してください。


Oracle Flashback Transaction QueryとOracle Flashback Version Queryの併用

この例では、サンプルのHRスキーマにおけるemployeesおよびdepartments表の単純なバージョンを使用しています。

この例では、データベース管理者はSQL*Plusを使用して次のコマンドを実行します。

CREATE TABLE emp
   (empno   NUMBER PRIMARY KEY,
    empname VARCHAR2(16)
    salary  NUMBER);
INSERT INTO emp VALUES (111, 'Mike', 555);
COMMIT;

CREATE TABLE dept
   (deptno   NUMBER,
    deptname VARCHAR2(32));
INSERT INTO dept VALUES (10, 'Accounting');
COMMIT;

この時点で、empおよびdeptにはそれぞれ1行があります。行バージョンに関しては、各表に1つのバージョンを示す1行が含まれます。誤ったトランザクションにより、empno 111が表empから削除されたとします。

UPDATE emp SET salary = salary + 100 WHERE empno = 111;
INSERT INTO dept VALUES (20, 'Finance');
DELETE FROM emp WHERE empno = 111;
COMMIT;

次に、トランザクションにより、新規従業員名とともにempno 111が表empに再挿入されます。

INSERT INTO emp VALUES (111, 'Tom', 777);
UPDATE emp SET salary = salary + 100 WHERE empno = 111;
UPDATE emp SET salary = salary + 50 WHERE empno = 111;
COMMIT;

データベース管理者はアプリケーション・エラーを検出したため、問題を診断する必要があります。データベース管理者は次の問合せを発行し、empno 111に対応するemp表の行のバージョンを取得します。この問合せでは、Oracle Flashback Version Queryの疑似列が使用されます。

SELECT versions_xid XID, versions_startscn START_SCN,
  versions_endscn END_SCN, versions_operation OPERATION,
  empname, salary FROM hr.emp
  VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
  where empno = 111;

XID              START_SCN  END_SCN   OPERATION  EMPNAME    SALARY
---------------- ---------- --------- ---------- ---------- ----------
0004000700000058 113855               I          Tom        927
000200030000002D 113564               D          Mike       555
000200030000002E 112670     113564    I          Mike       555
3 rows selected

結果表の行は降順の時系列で示しています。3行目は、表が作成されたときに表に挿入された、表empの行のバージョンに対応しています。2行目は、誤ったトランザクションにより削除されたempの行に対応します。1行目は、新規従業員名とともに再挿入されたempの行のバージョンに対応します。

データベース管理者は、トランザクション000200030000002Dを誤ったトランザクションとして識別し、Oracle Flashback Transaction Queryを使用して、このトランザクションによるすべての変更を監査します。

SELECT  xid, start_scn START, commit_scn COMMIT, operation OP,
  logon_user USER, undo_sql
    FROM flashback_transaction_query
      WHERE xid = HEXTORAW('000200030000002D');

XID               START   COMMIT  OP       USER   UNDO_SQL
----------------  -----   ------  --       ----   ---------------------------
000200030000002D  195243  195244  DELETE   HR     insert into "HR"."EMP"
("EMPNO","EMPNAME","SALARY") values ('111','Mike','655');

000200030000002D  195243  195244  INSERT   HR     delete from "HR"."DEPT"
where ROWID = 'AAAKD4AABAAAJ3BAAB';

000200030000002D  195243  195244  UPDATE   HR     update "HR"."EMP"
set "SALARY" = '555' where ROWID = 'AAAKD2AABAAAJ29AAA';

000200030000002D  195243  113565  BEGIN  HR

4 rows selected

誤ったトランザクションおよびそれ以降のすべてのトランザクションを確認するには、データベース管理者は次の問合せを実行します。

SELECT xid, start_scn, commit_scn, operation, table_name, table_owner
  FROM flashback_transaction_query
  WHERE table_owner = 'HR' AND
        start_timestamp >=
          TO_TIMESTAMP ('2002-04-16 11:00:00','YYYY-MM-DD HH:MI:SS');

XID               START_SCN  COMMIT_SCN  OPERATION  TABLE_NAME  TABLE_OWNER
----------------  ---------  ----------  ---------  ----------  -----------
0004000700000058  195245     195246      UPDATE     EMP         HR
0004000700000058  195245     195246      UPDATE     EMP         HR
0004000700000058  195245     195246      INSERT     EMP         HR
000200030000002D  195243     195244      DELETE     EMP         HR
000200030000002D  195243     195244      INSERT     DEPT        HR
000200030000002D  195243     195244      UPDATE     EMP         HR

6 rows selected

ORA_ROWSCNの使用

ORA_ROWSCNは、固定されていない、または外部表ではない表の疑似列です。これは、指定された行に対する最新の変更のSCNを表します。つまり、その行に対する最新のCOMMIT操作です。次に例を示します。

SELECT ora_rowscn, last_name, salary
  FROM employees
  WHERE employee_id = 7788;

ORA_ROWSCN    NAME    SALARY
----------    ----    ------
    202553    Fudd      3000

その行に対する最新のCOMMIT操作は、SCNが202553ほどのところで発生しています。SCNを対応するTIMESTAMP値に変換するには、SCN_TO_TIMESTAMPファンクションを使用します。

ORA_ROWSCNは、最新コミット時間の堅実な上限値であり、実際のコミットSCNはこれより若干前になる場合があります。行に依存する表(CREATE TABLEROWDEPENDENCIES句と併用して作成)では、ORA_ROWSCNはより正確になります(実際のコミットSCNに近づきます)。

アプリケーション開発におけるORA_ROWSCNの使用には、同時実行性制御およびクライアント・キャッシュの無効化があります。

内容は次のとおりです。

使用例: 同時実行性制御

アプリケーションでデータ行が検査され、対応するORA_ROWSCN202553として記録されます。その後、このアプリケーションでは、行が変更されていない場合のみ、行を更新する必要があります。この操作は、ORA_ROWSCNがまだ202553であることが条件となります。同等の対話型文を示します。

UPDATE employees
  SET salary = salary + 100
  WHERE employee_id = 7788
  AND ora_rowscn = 202553;

0 rows updated.

この場合、ORA_ROWSCNがすでに202553ではないため、条件付きの更新に失敗します。したがって、行はユーザーまたは他のアプリケーションによって、記録されているORA_ROWSCNよりも最近に変更され、COMMITが実行されています。

アプリケーションでは、新しい行データおよびORA_ROWSCNを取得するため、再度問合せが実行されます。ORA_ROWSCNが現在415639であるとします。アプリケーションでは、新しいORA_ROWSCNにより、再度条件付き更新が試行されます。今回は更新に成功し、コミットされました。同等の対話型文を示します。

SQL> UPDATE employees SET salary = salary + 100
     WHERE empno = 7788 AND ora_rowscn = 415639;

1 row updated.

SQL> COMMIT;

Commit complete.

SQL> SELECT ora_rowscn, name, salary FROM employees WHERE empno = 7788;

ORA_ROWSCN    NAME    SALARY
----------    ----    ------
    465461    Fudd      3100

新しいCOMMITに対応するSCNは、465461です。

UPDATE文のWHERE句でORA_ROWSCNを使用するだけでなく、DELETE文のWHERE句またはOracle Flashback QueryのAS OF句で使用できます。

ORA_ROWSCNおよび仮想プライベート・データベース(VPD)の表

VPDポリシーを表に追加すると、ORA_ROWSCN擬似列を選択できなくなります。ただし、ORA_ROWSCNがポリシー・ファンクション内で使用可能な場合は、次の操作を実行できます。

  1. 例13-3のように、行SCNを返すファンクションを作成します。

  2. ポリシー述語ファンクションに、ファンクションが行を処理するときに使用するコンテキストで行SCNを格納する述語を追加します。次に例を示します。

    ||' AND f_ora_rowscn('||object_name||'.ora_rowscn) = 1'
    
  3. ファンクションを使用して行をフェッチします。次に例を示します。

    SELECT t.*, get_rowscn(t.rowid) "ORA_ROWSCN" FROM test_table t;
    

例13-3 VPDの表から行SCNを返すファンクション

-- Create context that function will use while processing rows:

CREATE OR REPLACE FUNCTION f_ora_rowscn
 (rowscn IN NUMBER)
 RETURN NUMBER
AS
BEGIN
  DBMS_SESSION.SET_CONTEXT('STORE_ROWSCN','ROWSCN',rowscn);
  RETURN 1;
END;
/

CREATE CONTEXT store_rowscn USING f_ora_rowscn;

-- Create function that returns row SCN for each row:

CREATE OR REPLACE FUNCTION get_rowscn
  (row IN ROWID)
  RETURN VARCHAR2
AS
BEGIN
  RETURN sys_context('STORE_ROWSCN','ROWSCN');
END;
/

DBMS_FLASHBACKパッケージの使用

DBMS_FLASHBACKパッケージでもOracle Flashback Queryと同じ機能が提供されますが、Oracle Flashback Queryのほうが便利な場合があります。

DBMS_FLASHBACKパッケージはタイムマシンのように機能します。つまり、時計を特定の時点に戻して、過去のその時点にいるかのように通常の問合せを実行し、その後現在に戻ることができます。DBMS_FLASHBACKパッケージを使用して、AS OFVERSIONS BETWEENなどの特別な句を使用せずに過去のデータに問合せを実行できるため、既存のPL/SQLコードを再使用して、過去の時点のデータベースを問い合せることができます。

DBMS_FLASHBACKパッケージのEXECUTE権限が必要です。

PL/SQLコードでDBMS_FLASHBACKパッケージを使用する手順は、次のとおりです。

  1. DBMS_FLASHBACK.ENABLE_AT_TIMEまたはDBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBERを起動して、過去の時間を指定します。

  2. 通常の問合せ(AS OFなど、特別なフラッシュバック機能の構文を使用しない)を実行します。DDL操作やDML操作は実行しません。

    指定された過去の時間におけるデータベースに対し、問合せが行われます。

  3. DBMS_FLASHBACK.DISABLEを起動して現在の時間に戻ります。

    再度DBMS_FLASHBACK.ENABLE_AT_TIMEまたはDBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBERを起動する前に、DBMS_FLASHBACK.DISABLEを起動する必要があります。ENABLE/DISABLEのペアはネストできません。

カーソルを使用して問合せの結果を格納するには、カーソルをオープンしてからDBMS_FLASHBACK.DISABLEを起動します。結果を格納し、DBMS_FLASHBACK.DISABLEを起動した後、次のことができます。

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBERを起動して、いつでも現在のシステム変更番号(SCN)を取得できます。事前のDBMS_FLASHBACK.ENABLEの起動とは関係なく、DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBERでは、必ず現在のSCNが戻されます。


関連項目:

  • DBMS_FLASHBACKパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。


フラッシュバック・トランザクションの使用

DBMS_FLASHBACK.TRANSACTION_BACKOUTプロシージャ(TRANSACTION_BACKOUT)では、データベースがオンラインである間にトランザクションおよびその依存トランザクションをロールバックします。このリカバリ操作では、UNDOデータを使用して対応する補正トランザクションを作成および実行します。このトランザクションによって影響のあったデータが元の状態に戻ります。

内容は次のとおりです。

TRANSACTION_BACKOUTパラメータ

TRANSACTION_BACKOUTプロシージャのパラメータは次のとおりです。

  • バックアウトするトランザクションの数

  • 名前またはXIDで識別されたバックアウトするトランザクションのリスト

  • 時間ヒント(名前でトランザクションを識別する場合)

    任意のトランザクションの開始時間より早い時間を指定します。

  • 表13-2のバックアウト・オプション

TRANSACTION_BACKOUTプロシージャの構文およびパラメータの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

表13-2 フラッシュバックTRANSACTION_BACKOUTオプション

オプション 説明

CASCADE

後行順で指定トランザクションおよびすべての依存トランザクションをバックアウトします(つまり、親がバックアウトされる前に子がバックアウトされます)。

CASCADEがない場合、依存トランザクションが指定されていないとエラーが発生します。

NOCASCADE

デフォルト。依存トランザクションを持たないと予想される指定トランザクションをバックアウトします。最初の依存トランザクションによってエラーが発生し、*_FLASHBACK_TRANSACTION_REPORTに表示されます。

NOCASCADE_FORCE

依存トランザクションを無視して、指定トランザクションをバックアウトします。サーバーでは、コミット時間とは逆の順序で指定トランザクションのUNDO SQL文を実行します。

制約に違反せず、その結果に満足している場合は、変更をコミットできます。それ以外の場合は、ロールバックできます。

NONCONFLICT_ONLY

指定トランザクションの競合しない行に変更をバックアウトします。データベースの一貫性は保たれますが、トランザクションは完全に失われます。


TRANSACTION_BACKOUTではトランザクションの依存性を分析してDML操作を実行し、レポートを生成します。TRANSACTION_BACKOUTではトランザクション・バックアウトの一環として実行されるDML操作はコミットしませんが、正しい形式で行および表に対する必要なロックを保持し、他の依存関係がシステムに介入しないようにします。トランザクション・バックアウトを永続的なものにするには、明示的にトランザクションをコミットする必要があります。

TRANSACTION_BACKOUTレポート

TRANSACTION_BACKOUTによって生成されたレポートを参照するには、静的データ・ディクショナリ・ビュー*_FLASHBACK_TXN_STATEおよび*_FLASHBACK_TXN_REPORTを問い合せます。

*_FLASHBACK_TXN_STATE

静的データ・ディクショナリ・ビュー*_FLASHBACK_TXN_STATEでは、トランザクションがアクティブであるか、またはバックアウトされているかが示されます。このビューにトランザクションが表示される場合は、バックアウトされています。

*_FLASHBACK_TXN_STATEは、補正トランザクションに対してアトミックにメンテナンスされます。補正トランザクションがバックアウトされている場合、加えられたすべての変更もバックアウトされ、*_FLASHBACK_TXN_STATEにこれが反映されます。たとえば、補正トランザクションctがトランザクションt1およびt2をバックアウトする場合、t1およびt2*_FLASHBACK_TXN_STATEに表示されます。ct自身が後でバックアウトされる場合、t1およびt2による影響は元に戻され、t1およびt2*_FLASHBACK_TXN_STATEに表示されなくなります。


関連項目:

*_FLASHBACK_TXN_STATEの詳細は、『Oracle Databaseリファレンス』を参照してください。

*_FLASHBACK_TXN_REPORT

静的データ・ディクショナリ・ビュー*_FLASHBACK_TXN_REPORTでは、各バックアウト・トランザクションの詳細レポートを生成します。


関連項目:

*_FLASHBACK_TXN_REPORTの詳細は、『Oracle Databaseリファレンス』を参照してください。

フラッシュバック・データ・アーカイブの使用(Oracle Total Recall)

フラッシュバック・データ・アーカイブ(Oracle Total Recall)により、その存続期間中、表に対するすべてのトランザクションによる変更を追跡および格納できます。今後、アプリケーションにこのインテリジェンスを組み込む必要はありません。フラッシュバック・データ・アーカイブは、レコード・ステージ・ポリシーと監査レポートのコンプライアンスに役立ちます。

フラッシュバック・データ・アーカイブは、1つ以上の表領域またはその部品で構成されます。フラッシュバック・データ・アーカイブは複数所有できます。SYSDBAとしてログオンしている場合は、システムに対してデフォルトのフラッシュバック・データ・アーカイブを指定できます。フラッシュバック・データ・アーカイブは、保有時間を使用して構成されます。フラッシュバック・データ・アーカイブにアーカイブされたデータは、保有時間中は保持されます。

デフォルトでは、表に対してフラッシュバック・アーカイブは無効になっています。次のすべてに該当する場合は表のフラッシュバック・アーカイブを有効にすることができます。

表に対してフラッシュバック・アーカイブを有効にした後は、FLASHBACK ARCHIVE ADMINISTERシステム権限がある場合、またはSYSDBAとしてログオンしている場合のみ、これを無効にできます。フラッシュバック・アーカイブは表に対して有効ですが、一部のDDL文はその表に対して許可されていません。

特定の表に対してフラッシュバック・データ・アーカイブを選択する場合は、その表のデータ保有要件およびFLASHBACK ARCHIVEオブジェクト権限のあるフラッシュバック・データ・アーカイブの保有時間を考慮してください。

内容は次のとおりです。


関連項目:

Oracle Total Recallの詳細は、http://www.oracle.com/database/total-recall.htmlを参照してください。

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

次を指定し、CREATE FLASHBACK ARCHIVE文を使用してフラッシュバック・データ・アーカイブを作成します。

  • フラッシュバック・データ・アーカイブの名前

  • フラッシュバック・データ・アーカイブの最初の表領域の名前

  • (オプション)フラッシュバック・データ・アーカイブが最初の表領域で使用できる最大領域量

    デフォルトは無制限です。最初の表領域の領域割当て制限も無制限でないかぎりは、この値を指定する必要があります。指定しない場合、ORA-55621のエラーが発生します。

  • 保有時間(表のフラッシュバック・データ・アーカイブのデータの格納が保証されている日数)

SYSDBAとしてログオンしている場合は、システムに対してこれをデフォルトのフラッシュバック・データ・アーカイブとして指定できます。このオプションを省略しても、後でこのフラッシュバック・データ・アーカイブをデフォルトにできます(「デフォルト・フラッシュバック・データ・アーカイブの指定」を参照)。

  • デフォルトのフラッシュバック・データ・アーカイブfla1を作成します。これは最大10GBの表領域tbs1を使用し、そのデータは1年間保持されます。

    CREATE FLASHBACK ARCHIVE DEFAULT fla1 TABLESPACE tbs1
      QUOTA 10G RETENTION 1 YEAR;
    
  • フラッシュバック・データ・アーカイブfla2を作成します。これは表領域tbs2を使用し、そのデータは2年間保持されます。

    CREATE FLASHBACK ARCHIVE fla2 TABLESPACE tbs2 RETENTION 2 YEAR;
    

CREATE FLASHBACK ARCHIVE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

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

ALTER FLASHBACK ARCHIVE文を使用して、次を実行できます。

  • フラッシュバック・データ・アーカイブの保有時間を変更します。

  • データの一部またはすべてをパージします。

  • 表領域を追加、変更、削除します。


    注意:

    フラッシュバック・データ・アーカイブのすべての表領域を削除すると、エラーが発生します。

SYSDBAとしてログオンしている場合は、ALTER FLASHBACK ARCHIVE文を使用して、特定のファイルをシステムに対するデフォルトのフラッシュバック・データ・アーカイブにすることもできます。

  • フラッシュバック・データ・アーカイブfla1を、デフォルトのフラッシュバック・データ・アーカイブにします。

    ALTER FLASHBACK ARCHIVE fla1 SET DEFAULT;
    
  • フラッシュバック・データ・アーカイブfla1に対して、最大5GBの表領域tbs3を追加します。

    ALTER FLASHBACK ARCHIVE fla1 ADD TABLESPACE tbs3 QUOTA 5G;
    
  • フラッシュバック・データ・アーカイブfla1に対して、必要に応じてtbs4と同じサイズの表領域を追加します。

    ALTER FLASHBACK ARCHIVE fla1 ADD TABLESPACE tbs4;
    
  • フラッシュバック・データ・アーカイブfla1が表領域tbs3で使用できる最大領域を20GBに変更します。

    ALTER FLASHBACK ARCHIVE fla1 MODIFY TABLESPACE tbs3 QUOTA 20G;
    
  • フラッシュバック・データ・アーカイブfla1に対して、必要に応じてtbs1と同じサイズの表領域を使用できるようにします。

    ALTER FLASHBACK ARCHIVE fla1 MODIFY TABLESPACE tbs1;
    
  • フラッシュバック・データ・アーカイブfla1の保有時間を2年に変更します。

    ALTER FLASHBACK ARCHIVE fla1 MODIFY RETENTION 2 YEAR;
    
  • フラッシュバック・データ・アーカイブfla1から表領域tbs2を削除します。

    ALTER FLASHBACK ARCHIVE fla1 REMOVE TABLESPACE tbs2;
    

    (表領域tbs2は削除されません。)

  • フラッシュバック・データ・アーカイブfla1からすべての履歴データをパージします。

    ALTER FLASHBACK ARCHIVE fla1 PURGE ALL;
    
  • フラッシュバック・データ・アーカイブfla1から1日以上経過したすべての履歴データをパージします。

    ALTER FLASHBACK ARCHIVE fla1
      PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
    
  • フラッシュバック・データ・アーカイブfla1からSCN 728969より古いすべての履歴データをパージします。

    ALTER FLASHBACK ARCHIVE fla1 PURGE BEFORE SCN 728969;
    

ALTER FLASHBACK ARCHIVE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

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

DROP FLASHBACK ARCHIVE文を使用してフラッシュバック・データ・アーカイブを削除します。フラッシュバック・データ・アーカイブを削除するとその履歴データは削除されますが、その表領域は削除されません。

表領域を削除せず、フラッシュバック・データ・アーカイブfla1およびその履歴データを削除します。

DROP FLASHBACK ARCHIVE fla1;

DROP FLASHBACK ARCHIVE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

デフォルト・フラッシュバック・データ・アーカイブの指定

デフォルトでは、システムにはデフォルト・フラッシュバック・データ・アーカイブがありません。SYSDBAとしてログオンしている場合は、次のいずれかの方法で指定できます。

  • ALTER FLASHBACK ARCHIVE文のSET DEFAULT句を使用して、既存のフラッシュバック・データ・アーカイブの名前を指定します。次に例を示します。

    ALTER FLASHBACK ARCHIVE fla1 SET DEFAULT;
    

    fla1がない場合は、エラーが発生します。

  • フラッシュバック・データ・アーカイブを作成する際、CREATE FLASHBACK ARCHIVE文にDEFAULTを含めます。次に例を示します。

    CREATE FLASHBACK ARCHIVE DEFAULT fla2 TABLESPACE tbs1
      QUOTA 10G RETENTION 1 YEAR;
    

システムのデフォルト・フラッシュバック・データ・アーカイブは、自分自身のデフォルト・フラッシュバック・データ・アーカイブを持たないすべてのユーザーに対するデフォルト・フラッシュバック・データ・アーカイブです。


関連項目:

  • CREATE FLASHBACK ARCHIVE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • ALTER DATABASE文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


フラッシュバック・データ・アーカイブの有効化および無効化

デフォルトでは、表に対してフラッシュバック・アーカイブは無効になっています。その表に対して使用するフラッシュバック・データ・アーカイブのFLASHBACK ARCHIVEオブジェクト権限がある場合は、表のフラッシュバック・アーカイブを有効にできます。

表に対してフラッシュバック・アーカイブを有効にするには、CREATE TABLE文またはALTER TABLE文にFLASHBACK ARCHIVE句を含めます。FLASHBACK ARCHIVE句には、その表の履歴データを格納するフラッシュバック・データ・アーカイブを指定できます。デフォルトは、システムに対してデフォルトのフラッシュバック・データ・アーカイブです。存在しないフラッシュバック・データ・アーカイブを指定すると、エラーが発生します。

表に対してフラッシュバック・アーカイブを有効にしても、AUMが無効な場合は、表を変更しようとするとエラーORA-55614が発生します。

表でフラッシュバック・アーカイブがすでに有効になっている場合は、別のフラッシュバック・データ・アーカイブを再度有効にしようとするとエラーが発生します。

表に対してフラッシュバック・アーカイブを有効にした後は、FLASHBACK ARCHIVE ADMINISTERシステム権限がある場合、またはSYSDBAとしてログオンしている場合のみ、これを無効にできます。表に対してフラッシュバック・アーカイブを無効にするには、ALTER TABLE文にNO FLASHBACK ARCHIVEを指定します。(CREATE TABLE文にNO FLASHBACK ARCHIVEを指定する必要はありません。これはデフォルトです。)


関連項目:

CREATE TABLE文のFLASHBACK ARCHIVE句の詳細(使用制限も含む)は、『Oracle Database SQL言語リファレンス』を参照してください。

  • employeeを作成してデフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。

    CREATE TABLE employee (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10),
      JOB VARCHAR2(9), MGR NUMBER(4)) FLASHBACK ARCHIVE;
    
  • employeeを作成してフラッシュバック・データ・アーカイブfla1に履歴データを格納します。

    CREATE TABLE employee (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10),
      JOB VARCHAR2(9), MGR NUMBER(4)) FLASHBACK ARCHIVE fla1;
    
  • employeeのフラッシュバック・アーカイブを有効にして、デフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。

    ALTER TABLE employee FLASHBACK ARCHIVE;
    
  • employeeのフラッシュバック・アーカイブを有効にして、フラッシュバック・データ・アーカイブfla1に履歴データを格納します。

    ALTER TABLE employee FLASHBACK ARCHIVE fla1;
    
  • employeeのフラッシュバック・アーカイブを無効にします。

    ALTER TABLE employee NO FLASHBACK ARCHIVE;
    

フラッシュバック・データ・アーカイブが有効な表で許可されないDDL文

フラッシュバック・データ・アーカイブを有効にした表に対して次のいずれかのDDL文を使用すると、エラーORA-55610が発生します。

  • ALTER TABLE文では、次のいずれかが実行されます。

    • 列の削除、名前変更、または変更

    • パーティション操作またはサブパーティション操作

    • LONG列のLOB列への変換

    • INCLUDING DATA句ありまたはなしでのUPGRADE TABLE句の挿入

  • DROP TABLE

  • RENAME TABLE

  • TRUNCATE TABLE


関連項目:

このようなDDL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

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

表13-3に静的データ・ディクショナリ・ビューを示し、簡潔に説明します。このビューに対して、フラッシュバック・データ・アーカイブ・ファイルに関する情報の問合せを実行できます。

表13-3 フラッシュバック・データ・アーカイブ・ファイルの静的データ・ディクショナリ・ビュー

ビュー 説明

*_FLASHBACK_ARCHIVE

フラッシュバック・データ・アーカイブ・ファイルに関する情報を表示します。

*_FLASHBACK_ARCHIVE_TS

フラッシュバック・データ・アーカイブ・ファイルの表領域を表示します。

*_FLASHBACK_ARCHIVE_TABLES

データ・フラッシュバック・アーカイブ・ファイルが有効になっている表に関する情報を表示します。



関連項目:

  • *_FLASHBACK_ARCHIVEの詳細は、『Oracle Databaseリファレンス』を参照してください。

  • *_FLASHBACK_ARCHIVE_TSの詳細は、『Oracle Databaseリファレンス』を参照してください。

  • *_FLASHBACK_ARCHIVE_TABLESの詳細は、『Oracle Databaseリファレンス』を参照してください。


フラッシュバック・データ・アーカイブの使用例

使用例: フラッシュバック・データ・アーカイブを使用したデジタル・シュレッディングの実行

企業でTaxes表に対する履歴データの変更内容を10年後に「シュレッド」(削除)するとします。Taxesのフラッシュバック・データ・アーカイブを作成する際、10年の保有時間を指定します。

CREATE FLASHBACK ARCHIVE taxes_archive TABLESPACE tbs1 RETENTION 10 YEAR;

Taxesのトランザクションからの履歴データは、10年を超えるとパージされます。(Taxesの表自体、および10年未満のトランザクションからの履歴データはパージされません。)

使用例: フラッシュバック・データ・アーカイブを使用した履歴データへのアクセス

inventoryから年初にすべての品目の在庫を取得できるように、また、表stock_dataからその年の任意の日付の業務終了時点での自社の有価証券における、各シンボルの株価を取得できるようにするとします。

デフォルトのフラッシュバック・データ・アーカイブfla1を作成します。これは最大10GBの表領域tbs1を使用し、そのデータは5年間保持されます(SYSDBAとしてログオンしている必要があります)。

CREATE FLASHBACK ARCHIVE DEFAULT fla1 TABLESPACE tbs1
  QUOTA 10G RETENTION 5 YEAR;

inventoryおよびstock_dataのフラッシュバック・データ・アーカイブを有効にして、デフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。

ALTER TABLE inventory FLASHBACK ARCHIVE;
ALTER TABLE stock_data FLASHBACK ARCHIVE;

2007年の年初にすべての品目の在庫を取得するには、次の問合せを使用します。

SELECT product_number, product_name, count FROM inventory AS OF
  TIMESTAMP TO_TIMESTAMP ('2007-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');

2007年7月23日の業務の終了時に有価証券の各シンボルの株価を取得するには、次の問合せを使用します。

SELECT symbol, stock_price FROM stock_data AS OF
  TIMESTAMP TO_TIMESTAMP ('2007-07-23 16:00:00', 'YYYY-MM-DD HH24:MI:SS')
  WHERE symbol IN my_portfolio;

使用例: フラッシュバック・データ・アーカイブを使用したレポートの生成

ユーザーが、過去5年間格納されているデータについて、表investmentsからレポートを生成できるようにするとします。

デフォルトのフラッシュバック・データ・アーカイブfla2を作成します。これは最大20GBの表領域tbs1を使用し、そのデータは5年間保持されます(SYSDBAとしてログオンしている必要があります)。

CREATE FLASHBACK ARCHIVE DEFAULT fla2 TABLESPACE tbs1
  QUOTA 20G RETENTION 5 YEAR;

investmentsのフラッシュバック・アーカイブを有効にして、デフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。

ALTER TABLE investments FLASHBACK ARCHIVE;

Lisaは、2006年12月31日の業務終了時点での投資の運用成績に関するレポートが必要なため、次の問合せを使用します。

SELECT * FROM investments AS OF
  TIMESTAMP TO_TIMESTAMP ('2006-12-31 16:00:00', 'YYYY-MM-DD HH24:MI:SS')
  WHERE name = 'LISA';

使用例: フラッシュバック・データ・アーカイブの監査への使用

医療保険会社では、診療所を監査する必要があります。医療保険会社は表Billingsにその債権があり、デフォルトのフラッシュバック・データ・アーカイブfla4を作成します。これは最大100GBの表領域tbs1を使用し、そのデータは10年間保持されます。

CREATE FLASHBACK ARCHIVE DEFAULT fla4 TABLESPACE tbs1
  QUOTA 100G RETENTION 10 YEAR;

この会社では表Billingsのフラッシュバック・アーカイブを有効にして、デフォルトのフラッシュバック・データ・アーカイブに履歴データを格納します。

ALTER TABLE Billings FLASHBACK ARCHIVE;

2007年5月1日に、クライアントは診断と検査について誤った金額を請求されました。2007年5月1日現在の記録を確認するには、会社は次の問合せを使用します。

SELECT date_billed, amount_billed, patient_name, claim_Id,
  test_costs, diagnosis FROM Billings AS OF
  TO_TIMESTAMP('2007-05-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');

使用例: フラッシュバック・データ・アーカイブを使用したデータのリカバリ

エンド・ユーザーが、データベースですでにコミット済の誤ったトランザクションからリカバリします。誤ったトランザクションのUNDOデータは今後利用できなくなりますが、必要な履歴情報がフラッシュバック・データ・アーカイブにあるため、フラッシュバック問合せはシームレスに機能します。

Lisaはソフトウェア開発グループを管理しており、そのグループの製品販売が好調です。このため、2007年11月3日に、2年を超える経験を有するレベル3の全従業員に10%の昇給とレベル4への昇進を与えることを決定します。Lisaはこの変更を人事部(HR)代表のBobに依頼します。

BobはHRのWebアプリケーションを使用して、employee表を更新し、Lisaのレベル3の部下に10%の昇給とレベル4への昇進を与えます。次に、Bobは当日の自分の業務を終了して退社しますが、トランザクション中に2年の経験という要件を省略したことに気づいていません。数日後、Bobが更新を完了したかどうかをLisaが確認した際、昇給がグループの全員に与えられたことが判明します。LisaはただちにBobに電話し、誤りを修正するよう要求します。

Bobは最初は、バックアップにアクセスしなければ従業員表を以前の状態に戻せないと考えます。次に、employee表ではフラッシュバック・データ・アーカイブが有効になっていることを思い出します。

Bobは最初に、彼の変更後にemployee表を変更した他のトランザクションがないことを検証します。トランザクション問合せからのコミット・タイムスタンプは、2日前のBobのトランザクションと一致します。

次に、Bobは次の文を使用してemployee表を誤った変更以前の状態に戻します。

DELETE EMPLOYEE WHERE MANAGER = 'LISA JOHNSON';
INSERT INTO EMPLOYEE
  SELECT * FROM EMPLOYEE
    AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' DAY)
      WHERE MANAGER = 'LISA JOHNSON';

それからBobはLisaに要求された更新を再度実行します。

Oracle Flashback Technologyの一般ガイドライン

Oracle Flashback Technologyのパフォーマンス・ガイドライン