ヘッダーをスキップ
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス
11g リリース1(11.1)
E05686-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

57 DBMS_FLASHBACK

DBMS_FLASHBACKを使用して、指定した実時間または指定したシステム変更番号(SCN)にデータベースのバージョンをフラッシュバックできます。


関連項目:

DBMS_FLASHBACKの詳細は、次のマニュアルを参照してください。
  • 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』

  • 『Oracle Database SQL言語リファレンス』


この章では、次の項目について説明します。


DBMS_FLASHBACKの使用方法


概要

DBMS_FLASHBACKは、ユーザーが過去の特定の時点でのデータベースを表示するためのインタフェースを提供します。個々のトランザクションの結果を選択して削除できるトランザクション・バックアウト機能も追加されています。データベースを実際に過去の時点に戻すフラッシュバック・データベースとは混同しないでください。

DBMS_FLASHBACKが有効化された場合、ユーザー・セッションはデータベースのフラッシュバック・バージョンを使用します。また、アプリケーションをデータベースのフラッシュバック・バージョンで実行することができます。

DBMS_FLASHBACKは、次のような場合に使用できます。


セキュリティ・モデル

このパッケージを使用するには、データベース管理者がDBMS_FLASHBACKに対するEXECUTE権限を付与する必要があります。


タイプ

DBMS_FLASHBACKサブプログラムでは、次のタイプが使用されます。

表57-1 DBMS_FLASHBACK

タイプ 説明

TXNAME_ARRAY

トランザクション名またはトランザクション識別子(XID)を保持するためのVARRAYを作成します。



例外

表57-2 DBMS_FLASHBACKエラー・メッセージ

エラー 説明

ORA-08180

指定された時間が古すぎます。

ORA-08181

無効なシステム変更番号が指定されました。

ORA-08182

ユーザーは、フラッシュバック・モードにおいて、読取り専用またはシリアル化可能トランザクションを開始できません。

ORA-08183

ユーザーは、コミットされていないトランザクションにおいてフラッシュバックを有効化できません。

ORA-08184

ユーザーは、別のフラッシュバック・セッションにおいてフラッシュバックを有効化できません。

ORA-08185

SYSはフラッシュバック・モードを有効化できません。



使用上の注意

接続切断または別の接続の開始によりセッションが終了すると、DBMS_FLASHBACKは自動的に無効化されます。

フラッシュバック・モードでオープンされたPL/SQLカーソルは、フラッシュバック時間またはSCNの時点での行を戻します。データベースにおける異なる同時セッション(接続)では、異なる実時間またはSCNに対してフラッシュバックを実行できます。セッションがフラッシュバック・モードで実行されている間は、DMLおよびDDL処理ならびに分散処理を行うことはできません。オープンしているPL/SQLカーソルは、フラッシュバックを無効にしてDMLを実行するまで使用できます。

自動UNDO管理(AUM)モードでは、保存制御を使用して、必要なデータベースのバージョンを何時間戻すのかを制御できます。24時間フラッシュバックを実行する必要がある場合、DBAはundo_retentionパラメータを24時間に設定する必要があります。このように、システムはデータの旧バージョンを再生成するのに十分なロールバック情報を保持しています。

UNDO表領域にRETENTION GUARANTEE句を設定し、期限切れになっていないUNDOが廃棄されないようにできます。UNDO_RETENTION自体に完全な保証はありません。システムの領域が不足気味である場合に、期限切れになっていないUNDOが新しく生成されたUNDOによって上書きされることがあるためです。このような状況は、RETENTION GUARANTEEによって防ぐことができます。 詳細は、『Oracle Database管理者ガイド』を参照してください。

フラッシュバックが有効化されたセッションでは、SYSDATEは影響を受けません。引き続き、現在の時間が提供されます。

ログイン・トリガーにおいてDBMS_FLASHBACKを使用し、アプリケーション・コードを変更せずにフラッシュバックを有効化できます。


高年齢従業員を削除したことにより、その従業員に提出された人員レポートがすべて削除された場合に、フラッシュバックを使用する方法を次に示します。フラッシュバック機能を使用すると、消失した従業員をリカバリし、再挿入できます。

DROP TABLE employee;
DROP TABLE keep_scn;

REM -- Keep_scn is a temporary table to store scns that we are interested in

CREATE TABLE keep_scn (scn number);
SET ECHO ON
CREATE TABLE employee (
   employee_no   number(5) PRIMARY KEY,
   employee_name varchar2(20),
   employee_mgr  number(5)
      CONSTRAINT mgr_fkey REFERENCES EMPLOYEE ON DELETE CASCADE,
   salary        number,
   hiredate      date
);

REM -- Populate the company with employees
INSERT INTO employee VALUES (1, 'John Doe', null, 1000000, '5-jul-81');
INSERT INTO employee VALUES (10, 'Joe Johnson', 1, 500000, '12-aug-84');
INSERT INTO employee VALUES (20, 'Susie Tiger', 10, 250000, '13-dec-90');
INSERT INTO employee VALUES (100, 'Scott Tiger', 20, 200000, '3-feb-86');
INSERT INTO employee VALUES (200, 'Charles Smith', 100, 150000, '22-mar-88');
INSERT INTO employee VALUES (210, 'Jane Johnson', 100, 100000, '11-apr-87');
INSERT INTO employee VALUES (220, 'Nancy Doe', 100, 100000, '18-sep-93');
INSERT INTO employee VALUES (300, 'Gary Smith', 210, 75000, '4-nov-96');
INSERT INTO employee VALUES (310, 'Bob Smith', 210, 65000, '3-may-95');
COMMIT;

REM -- Show the entire org
SELECT lpad(' ', 2*(level-1)) || employee_name Name
FROM employee
CONNECT BY PRIOR employee_no = employee_mgr
START WITH employee_no = 1
ORDER BY LEVEL;

REM -- Sleep for a short time (approximately 10 to 20  seconds) to avoid
REM -- querying close to table creation

EXECUTE DBMS_LOCK.SLEEP(10);

REM -- Store this snapshot for later access through Flashback
DECLARE
I NUMBER;
BEGIN
I := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
INSERT INTO keep_scn VALUES (I);
COMMIT;
END;
/

REM -- Scott decides to retire but the transaction is done incorrectly
DELETE FROM EMPLOYEE WHERE employee_name = 'Scott Tiger';
COMMIT;

REM -- notice that all of scott's employees are gone
SELECT lpad(' ', 2*(level-1)) || employee_name Name
FROM EMPLOYEE
CONNECT BY PRIOR employee_no = employee_mgr
START WITH employee_no = 1
ORDER BY LEVEL;

REM -- Flashback to see Scott's organization
DECLARE
   restore_scn number;
BEGIN
   SELECT  scn INTO restore_scn FROM keep_scn;
   DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER (restore_scn);
END;
/

REM -- Show Scott's org.
SELECT lpad(' ', 2*(level-1)) || employee_name Name
FROM employee
CONNECT BY PRIOR employee_no = employee_mgr
START WITH employee_no =
   (SELECT employee_no FROM employee WHERE employee_name = 'Scott Tiger')
ORDER BY LEVEL;

REM -- Restore scott's organization.
DECLARE
   scotts_emp NUMBER;
   scotts_mgr NUMBER;
   CURSOR c1 IS
      SELECT employee_no, employee_name, employee_mgr, salary, hiredate
      FROM employee
      CONNECT BY PRIOR employee_no = employee_mgr
      START WITH employee_no =
         (SELECT employee_no FROM employee WHERE employee_name = 'Scott Tiger');
   c1_rec c1 % ROWTYPE;
BEGIN
   SELECT employee_no, employee_mgr INTO scotts_emp, scotts_mgr FROM employee
   WHERE employee_name = 'Scott Tiger';
   /* Open c1 in flashback mode */
   OPEN c1;
   /* Disable Flashback */
   DBMS_FLASHBACK.DISABLE;
 LOOP
   FETCH c1 INTO c1_rec;
   EXIT WHEN c1%NOTFOUND;
   /*
     Note that all the DML operations inside the loop are performed
     with Flashback disabled
   */
   IF (c1_rec.employee_mgr = scotts_emp) then
      INSERT INTO employee VALUES (c1_rec.employee_no,
         c1_rec.employee_name,
         scotts_mgr,
         c1_rec.salary,
         c1_rec.hiredate);
   ELSE
   IF (c1_rec.employee_no != scotts_emp) THEN
   INSERT INTO employee VALUES (c1_rec.employee_no,
         c1_rec.employee_name,
         c1_rec.employee_mgr,
         c1_rec.salary,
         c1_rec.hiredate);
      END IF;
    END IF;
 END LOOP;
END;
/

REM -- Show the restored organization.
select lpad(' ', 2*(level-1)) || employee_name Name
FROM employee
CONNECT BY PRIOR employee_no = employee_mgr
START WITH employee_no = 1
ORDER BY LEVEL;

DBMS_FLASHBACKサブプログラムの要約

表57-3 DBMS_FLASHBACKパッケージのサブプログラム

サブプログラム 説明

DISABLEプロシージャ


セッション全体においてフラッシュバック・モードを無効化します。

ENABLE_AT_SYSTEM_CHANGE_NUMBERプロシージャ


セッション全体においてフラッシュバックを使用できるようにします。SCNをOracleの数値型として使用し、セッションのスナップショットを指定した数値に設定します。フラッシュバック・モードでは、すべての問合せにおいて、指定した実時間またはSCNの時点と一致したデータが戻されます。

ENABLE_AT_TIMEプロシージャ


セッション全体においてフラッシュバックを使用できるようにします。 スナップショット・タイムは、query_timeで指定された時間に最も近いSCNに設定されます。

GET_SYSTEM_CHANGE_NUMBERファンクション


現在のSCNをOracleの数値型として戻します。SCNを使用して、特定のスナップショットを格納できます。

TRANSACTION_BACKOUTプロシージャ


トランザクションをバックアウトするためのメカニズムを提供します。



DISABLEプロシージャ

このプロシージャは、セッション全体においてフラッシュバック・モードを無効化します。

構文

DBMS_FLASHBACK.DISABLE;

次の例では、従業員Joeの2000年8月30日時点での給与を問い合せています。

EXECUTE dbms_flashback.enable_at_time('30-AUG-2000');
SELECT salary FROM emp where name = 'Joe'
EXECUTE dbms_flashback.disable;

ENABLE_AT_SYSTEM_CHANGE_NUMBERプロシージャ

このプロシージャは、SCNを入力パラメータとして使用し、セッションのスナップショットを指定した数値に設定します。フラッシュバック・モードでは、すべての問合せにおいて、指定した実時間またはSCNの時点と一致したデータが戻されます。セッション全体においてフラッシュバックを使用できるようにします。

構文

DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER (
   query_scn IN NUMBER);

パラメータ

表57-4 ENABLE_AT_SYSTEM_CHANGE_NUMBERプロシージャのパラメータ

パラメータ 説明

query_scn

システム変更番号(SCN)。トランザクションのコミットごとに増分するデータベースのバージョン・ナンバーです。



ENABLE_AT_TIMEプロシージャ

このプロシージャは、セッション全体においてフラッシュバックを使用できるようにします。 スナップショット・タイムは、query_timeで指定された時間に最も近いSCNに設定されます。セッション全体においてフラッシュバックを使用できるようにします。

構文

DBMS_FLASHBACK.ENABLE_AT_TIME (
   query_time   IN TIMESTAMP);

パラメータ

表57-5 ENABLE_AT_TIMEプロシージャのパラメータ

パラメータ 説明

query_time

これは、TIMESTAMP型の入力パラメータです。タイム・スタンプは次の方法で指定できます。

  • TIMESTAMPコンストラクタの使用。

    EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TIMESTAMP '2001-01-09 12:31:00').
    

    グローバリゼーション・サポート(NLS)フォーマットを使用し、文字列を指定します。フォーマットは、グローバリゼーション・サポートの設定により異なります。

  • TO_TIMESTAMPファンクションの使用。

    EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('12-02-2001 14:35:00', 'DD-MM-YYYY HH24:MI:SS'))
    

    使用する書式を指定します。 この例では、2001年2月12日午後2時35分のTO_TIMESTAMPファンクションを示しています。

  • 問合せ時間から時間が省略された場合、デフォルトはその日の午前12時となります。

  • 問合せ時間にタイム・ゾーンが含まれる場合、タイム・ゾーンの情報は切り捨てられるので注意してください。



GET_SYSTEM_CHANGE_NUMBERファンクション

このファンクションは、現在のSCNをOracleの数値データ型として戻します。現行の変更番号を取得し、後で使用するために保存できます。これは特定のスナップショットの保存に便利です。

構文

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
 RETURN NUMBER;

TRANSACTION_BACKOUTプロシージャ

このプロシージャは、一連のトランザクションをバックアウトするためのメカニズムを提供します。ユーザーは、トランザクション名またはトランザクション識別子(XIDS)のいずれかを指定して、これらのプロシージャをコールできます。

このプロシージャは、トランザクションの依存性の分析、DMLの実行、およびサブプログラムで実行された操作に対する広範囲なレポートの生成を行います。また、トランザクション・バックアウトの一部として実行されたDMLはコミットしません。ただし、行および表に対する必要なロックを正しい形式で保持します。このため、他の依存性がシステムに追加されることはありません。変更を永続的にするには、ユーザーがトランザクションを明示的にコミットする必要があります。

システム表DBA_FLASHBACK_TRANSACTION_STATEおよびDBA_FLASHBACK_TRANSACTION_REPORTにレポートが生成されます。

構文

DBMS_FLASHBACK.TRANSACTION_BACKOUT
   numberofxids       NUMBER,
   xids               XID_ARRAY,
   options            NUMBER default NOCASCADE,
   timeHint           TIMESTAMP default MINTIME);

DBMS_FLASHBACK.TRANSACTION_BACKOUT
   numberofxids       NUMBER,
   xids               XID_ARRAY,
   options            NUMBER default NOCASCADE,
   scnHint            TIMESTAMP default 0   );

DBMS_FLASHBACK.TRANSACTION_BACKOUT
   numberofxids      NUMBER,
   txnnames          TXNAME_ARRAY,
   options           NUMBER default NOCASCADE,
   timehint          TIMESTAMP MINTIME );

DBMS_FLASHBACK.TRANSACTION_BACKOUT
   numberofxids     NUMBER,
   txnNames         TXNAME_ARRAY,
   options          NUMBER default NOCASCADE,
   scnHint          NUMBER 0);

パラメータ

表57-6 TRANSACTION_BACKOUTプロシージャのパラメータ

パラメータ 説明

numberofxids

入力として渡されたトランザクションの数。

xids

配列の形式でのトランザクション識別子のリスト。

txnnames

配列の形式でのトランザクション名のリスト。

options

バックアウト依存トランザクション:

  • NOCASCADE: ユーザーは、依存性が存在しないことを予想しています。依存性が検出された場合は、エラーが発生します。最初の依存トランザクションがレポートに表示されます。

  • NOCASCADE_FORCE: ユーザーは、依存トランザクションを考慮せずに、指定したトランザクションを強制的にバックアウトします。RDBMSによって、指定したトランザクションに対して、コミット時と逆の順序でUNDO SQLが実行されます。制約違反がなく、結果に問題がない場合、ユーザーは、変更をコミット(COMMIT)するか、またはロールバック(ROLL BACK)します。

  • NONCONFLICT_ONLY: このオプションを使用すると、指定したトランザクションの競合が発生していない行に対する変更をバックアウトできます。トランザクションの依存性は、WAWによるか、主キー制約/一意キー制約によるかに関係なく、行の競合が原因で発生します。競合が発生していない行のみのバックアウトをユーザーが選択した場合は、データベースの一貫性に問題が発生することはありませんが、トランザクションの原子性は失われます。これはリカバリ操作であるため、ユーザーはデータを修正できます。

  • CASCADE: 指定したトランザクションおよびその依存性を後順(コミット時の逆の順序)で完全に削除します。

timehint

トランザクションの開始に関する時間ヒント。

scnhint

トランザクションの開始に関するSCNヒント。


使用上の注意