ヘッダーをスキップ

Oracle Database アプリケーション開発者ガイド-基礎編
10gリリース2(10.2)

B19248-02
目次
目次
索引
索引

戻る 次へ

10 フラッシュバック・アプリケーションの開発

この章の内容は次のとおりです。

フラッシュバック機能の概要

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

データベースのフラッシュバック機能は、次の目的に使用できます。

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

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

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

アプリケーション開発では、フラッシュバック機能を使用して、履歴データに関するレポートを作成したり、誤った変更を元に戻すことができます。フラッシュバック機能には次のものが含まれます。

データベース管理機能

アプリケーション開発または対話形式で、データベース・ユーザーまたは管理者として、次の機能を使用できます。

次のフラッシュバック機能は、通常はデータベース管理においてのみ使用します。

Oracle Flashback Database、Oracle Flashback TableおよびOracle Flashback Dropは、主にデータ・リカバリのメカニズムであるため、詳細は他のドキュメントで説明されています。その他のフラッシュバック機能は、データ・リカバリでも重要なものですが、アプリケーション開発にも便利な機能です。この章ではこれらの機能について説明します。

関連項目

  • 『Oracle Databaseバックアップおよびリカバリ・アドバンスト・ユーザーズ・ガイド』

  • フラッシュバック・ドロップ機能の詳細は、『Oracle Database管理者ガイド』を参照してください。

  • 表のフラッシュバック機能の詳細は、『Oracle Database管理者ガイド』を参照してください。

  • 自動UNDO管理の詳細は、『Oracle Database管理者ガイド』を参照してください。

 

フラッシュバック機能を使用する前のデータベース管理タスク

アプリケーションでフラッシュバック機能を使用するには、まず、次の管理タスクを実行してデータベースを構成する必要があります。これらのタスクを実行するには、データベース管理者に相談してください。

フラッシュバック問合せ(SELECT ...AS OF)の使用

フラッシュバック問合せは、SELECT文でAS OF句を使用して実行します。フラッシュバック問合せを使用すると、過去のある時点で存在していたデータを取得できます。問合せでは、タイムスタンプまたはSCNを使用することで、過去の時点が明示的に参照されます。その時点で最新であったコミット済データが戻されます。

フラッシュバック問合せは、次のような場合に使用します。

過去のデータの検査: 例

この例では、フラッシュバック問合せを使用して、以前の時点での表の状態を調べます。たとえば、DBAが午後12時30分に、従業員Chungの行がemployee表から削除されていることに気付いたとします。また、このDBAが、午前9時30分にはChungのデータがデータベースに正しく格納されていたことを知っているとします。DBAは、フラッシュバック問合せを使用して9時30分時点の表の内容を調べ、失われたデータを見つけることができます。その後必要に応じて、DBAは失われたデータを再挿入できます。

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

例 10-1    フラッシュバック問合せを使用した行の取得

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

例10-2の更新により、Chungの情報がemployees表にリストアされます。

例 10-2    フラッシュバック問合せ後の行の再挿入

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');

フラッシュバック問合せの使用に関するヒント

フラッシュバック問合せ(SELECT ...AS OF)を使用する場合、次の点に注意してください。

DBMS_FLASHBACKパッケージの使用

DBMS_FLASHBACKパッケージでも、一般にフラッシュバック問合せと同じ機能が提供されますが、フラッシュバック問合せのほうが便利な場合があります。

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をコールし、現在に戻ります。別の時間について再度ENABLEをコールする前に、DISABLEをコールする必要があります。ENABLE / DISABLEのペアはネストできません。

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

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBERをコールして、いつでも現在のシステム変更番号(SCN)を取得できます。必ず現在のSCNが戻される点に注意してください。DBMS_FLASHBACK.ENABLE*に対する以前のコールは無視されます。

関連項目

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

  • SCNの詳細は、『Oracle Databaseリファレンス』およびOracle Database Recovery Managerリファレンスを参照してください。

 

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_TO_TIMESTAMPファンクションを使用して、ORA_ROWSCNのようなSCNを、対応するTIMESTAMP値に変換できます。

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

アプリケーション開発においてORA_ROWSCNを使用することの特に有益な点は、同時実行性制御およびクライアント・キャッシュの無効化があります。同時実行性制御における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句またはフラッシュバック問合せのAS OF句で使用できます。

関連項目

『Oracle Database SQLリファレンス』 

フラッシュバック・バージョン問合せの使用

特定の時間間隔内に存在していた、特定の行の様々なバージョンを取得するには、フラッシュバック・バージョン問合せを使用します。COMMIT文が実行されると、そのたびに新しい行バージョンが作成されます。

フラッシュバック・バージョン問合せを指定するには、SELECT文でVERSIONS BETWEEN句を使用します。その構文を次に示します。

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

ここで、startおよびendはそれぞれ、問合せ対象の時間間隔の開始点と終了点を表す式です。この時間間隔はその両端でクローズします。つまり、指定された上限および下限(startおよびend)は、どちらも時間間隔に含まれます。

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

表 10-1    フラッシュバック・バージョン問合せにおける行データ疑似列 
疑似列名  説明 

VERSIONS_STARTSCN

VERSIONS_STARTTIME 

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

これがNULLの場合、その行バージョンは、問合せのBETWEEN句の下限時間より前に作成されています。 

VERSIONS_ENDSCN

VERSIONS_ENDTIME 

行バージョンが期限切れとなったときのSCNまたはTIMESTAMP。これによって、行の有効期限が識別されます。

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

VERSIONS_XID 

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

VERSIONS_OPERATION 

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

注意: ユーザーによる索引キーの更新の場合、フラッシュバック・バージョン問合せでは、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

次に、一般的なフラッシュバック・バージョン問合せを示します。

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';

疑似列VERSIONS_XIDは、データをその状態にしたトランザクションに、一意の識別子を提供します。この値をフラッシュバック・トランザクション問合せと併せて使用して、FLASHBACK_TRANSACTION_QUERYビューで、行の変更を元に戻すために必要なSQLおよびその変更の担当ユーザーなど、このトランザクションに関するメタデータを検索できます。「フラッシュバック・トランザクション問合せの使用」を参照してください。

関連項目

フラッシュバック・バージョン問合せの疑似列、およびVERSIONS句の構文の詳細は、『Oracle Database SQLリファレンス』を参照してください。 

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

フラッシュバック・トランザクション問合せは、FLASHBACK_TRANSACTION_QUERYビューに対する問合せです。そのトランザクションによる各変更を元に戻す際に使用できるSQLコードなど、トランザクション情報を取得するには、フラッシュバック・トランザクション問合せを使用します。

関連項目

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

一例として、次の文では、トランザクション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');

もう一つの例として、次の問合せでは、フラッシュバック・バージョン問合せを副問合せとして使用し、各行バージョンを、行データの変更を担当する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'));

フラッシュバック・トランザクション問合せおよびフラッシュバック・バージョン問合せ: 例

この例は、フラッシュバック・トランザクション問合せとフラッシュバック・バージョン問合せの併用を示します。この例では、サンプルのhrスキーマにおけるemployeesおよびdepartments表の単純な変化が想定されています。

この例では、DBAがSQL*Plusで次の一連のアクションを実行しています。

connect hr/hr
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行が含まれます。次に、誤ったトランザクションにより、従業員ID111emp表から削除されたとします。

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

その後、新規トランザクションにより、従業員ID111および新規従業員名が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;

この時点で、DBAはアプリケーション・エラーを検出したため、問題を診断する必要があります。DBAは次の問合せを発行し、従業員番号111に対応するemp表の行のバージョンを取得します。この問合せでは、フラッシュバック・バージョン問合せの疑似列が使用されます。

connect dba_name/password
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の行のバージョンに対応します。

DBAは、トランザクション000200030000002Dを誤ったトランザクションとして識別し、次のフラッシュバック・トランザクション問合せを発行して、このトランザクションによるすべての変更を監査します。

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

一番右の列(undo_sql)には、対応する変更操作を元に戻すSQLコードが含まれます。DBAはこのコードを実行し、そのトランザクションによる変更を元に戻すことができます。USER列(logon_user)は、トランザクションの担当ユーザーを示します。

DBAは、特定の時間帯におけるすべての変更を把握する必要がある場合もあります。この使用例では、DBAは、以前識別された誤ったトランザクション以降に実行されたすべてのトランザクション(誤ったトランザクション自体を含む)の詳細を表示するために、次の問合せを実行します。

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

フラッシュバックのヒント

次のヒントおよび制限は、フラッシュバック機能の使用に適用されます。

フラッシュバックのヒント: パフォーマンス

フラッシュバックのヒント: 要約


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引