FLASHBACK TABLE

目的

FLASHBACK TABLE文を使用すると、人為的エラーまたはアプリケーション・エラーが発生した場合に、表を以前の状態にリストアできます。表をフラッシュバックできる過去の時点は、システム内のUNDOデータの量によって異なります。また、Oracle Databaseでは、表の構造を変更するDDL操作が行われた場合は、表を以前の状態にリストアできません。

ノート:

UNDO_MANAGEMENT初期化パラメータをデフォルトのAUTOのままにして、データベースを自動UNDOモードで実行することをお薦めします。また、UNDO_RETENTION初期化パラメータを、必要となる最も古いデータを含むために十分長い期間に設定してください。詳細は、UNDO_MANAGEMENT初期化パラメータおよびUNDO_RETENTION初期化パラメータに関するドキュメントを参照してください。

FLASHBACK TABLE文はロールバックできません。ただし、もう1つFLASHBACK TABLE文を発行し、現在の時間の直前の時間を指定することはできます。このため、FLASHBACK TABLE句を発行する前に、現在のSCNを記録しておくことをお薦めします。

関連項目:

前提条件

表を以前のSCNまたはタイムスタンプまでフラッシュバックするには、その表に対するFLASHBACKオブジェクト権限か、FLASHBACK ANY TABLEシステム権限が必要です。また、表に対するREADまたはSELECTオブジェクト権限と表に対するINSERTDELETEおよびALTERオブジェクト権限が必要です。

TO BEFORE DROPを使用せずに表をフラッシュバックする場合、フラッシュバック・リスト内のすべての表で、行の移動を有効にする必要があります。この操作はフラッシュバック削除といい、UNDOデータではなく、ごみ箱に削除されたデータを使用します。行の移動の有効化の詳細は、row_movement_clause」を参照してください。

表をリストア・ポイントにフラッシュバックするには、SELECT ANY DICTIONARYまたはFLASHBACK ANY TABLEのいずれかのシステム権限か、SELECT_CATALOG_ROLEロールが必要です。

DROP TABLE操作の前まで表をフラッシュバックするために必要な権限は、その表の削除に必要な権限のみです。

構文

flashback_table::=

セマンティクス

Oracle Flashback Tableの操作中は、フラッシュバック・リストに指定されたすべての表が、排他DMLロックによってロックされます。これらのロックによって、表を以前の状態に戻す操作の間に、それらの表に他の操作が行われなくなります。

表のフラッシュバック操作は、フラッシュバック・リストに指定された表の数に関係なく、1回のトランザクションで実行されます。すべての表が以前の状態に戻されるか、何も戻されないかのいずれかです。いずれかの表のフラッシュバック操作が正常に実行されなかった場合、この文全体が正常に実行されません。

表のフラッシュバック操作が完了すると、内のデータは、指定した過去の状態のと同一になります。ただし、FLASHBACK TABLE TO SCNまたはTIMESTAMPでは行IDが保持されず、FLASHBACK TABLE TO BEFORE DROPでは参照制約がリカバリされません。

に関連付けられた統計情報は、以前の形式には戻されません。の現行の索引は戻され、フラッシュバック時点での表の状態が反映されます。現行の索引がフラッシュバック時点で存在していなかった場合、その索引は、フラッシュバック時点の表の状態を反映するように更新されます。ただし、フラッシュバック時点から現時点の間に削除された索引は、リストアされません。

schema

表が含まれているスキーマを指定します。schemaを指定しない場合、表は自分のスキーマ内にあるとみなされます。

table

以前の状態に戻すデータを含む1つ以上の表の名前を指定します。

表のフラッシュバックの制限事項

この文には、次の制限事項があります。

  • 表のフラッシュバック操作は、クラスタ内の表、マテリアライズド・ビュー、アドバンスト・キューイング(AQ)表、静的データ・ディクショナリ表、システム表、リモート表、オブジェクト表、ネストした表、表の個々のパーティションまたはサブパーティションには無効です。

  • 表のアップグレード、移動、切捨て、表への制約の追加、クラスタへの表の追加、列の変更または削除、列の暗号化キーの変更、パーティションまたはサブパーティションの追加、削除、マージ、分割、結合、切捨て(レンジ・パーティションの追加を除く)のDDL操作を実行すると表の構造が変更されるため、これらの操作後にTO SCNまたはTO TIMESTAMP句を使用して表をその操作以前の時点にフラッシュバックすることはできません。

TO SCN句

表を戻す時点に対応するシステム変更番号(SCN)を指定します。exprは、有効なSCNに評価される数値である必要があります。

TO TIMESTAMP句

表を戻す時点に対応するタイムスタンプ値を指定します。exprは、過去の有効なタイムスタンプに評価される必要があります。表は、指定したタイムスタンプの約3秒以内の時点にフラッシュバックされます。

TO RESTORE POINT句

表をフラッシュバックするリストア・ポイントを指定します。リストア・ポイントは作成済である必要があります。

関連項目:

リストア・ポイントの作成の詳細は、「CREATE RESTORE POINT」を参照してください。

ENABLE | DISABLE TRIGGERS

デフォルトでは、表のフラッシュバック操作中は、tableに定義したすべての有効なトリガーが無効にされ、表のフラッシュバック操作の完了後に再度有効にされます。このデフォルト動作を上書きして、フラッシュバック処理中もトリガーを有効にする必要がある場合、ENABLE TRIGGERSを指定します。

この句は、tableに定義され、すでに有効にされているデータベース・トリガーのみに影響します。現在無効になっているトリガーを選択して有効にするには、ALTER TABLE ... enable_disable_clauseを使用してから、FLASHBACK TABLE文にENABLE TRIGGERS句を指定して発行します。

TO BEFORE DROP句

この句を使用すると、削除された表およびすべての依存するオブジェクトをごみ箱から取り出すことができます。表は、SYSTEM表領域以外のローカル管理表領域内に置いておく必要があります。

関連項目:

  • ごみ箱の詳細、およびごみ箱内のオブジェクトのネーミング規則の詳細は、『Oracle Database管理者ガイド』を参照してください。

  • ごみ箱からオブジェクトを完全に削除する方法の詳細は、「PURGE」を参照してください。

ユーザーが指定した元の表名か、オブジェクトの削除時にそのオブジェクトに割り当てられたシステム生成名を指定できます。

  • ごみ箱内のオブジェクトのシステム生成名は一意です。そのため、システム生成名を指定すると、その名前を持つ特定のオブジェクトが取り出されます。

    ごみ箱の内容を参照するには、USER_RECYCLEBINデータ・ディクショナリ・ビューを問い合せます。かわりにRECYCLEBINシノニムを使用することもできます。次の2つの文は、同じ行を戻します。

    SELECT * FROM RECYCLEBIN;
    SELECT * FROM USER_RECYCLEBIN;
    
  • ユーザー指定の名前を指定した場合、その名前を持つオブジェクトがごみ箱内に複数存在していると、ごみ箱に移動した日時が一番近いオブジェクトが取り出されます。その表のより古い状態で取り出す場合、次のいずれかの操作を実行します。

    • 取り出す表の、ごみ箱内でのシステム生成名を指定します。

    • 必要な表が取り出されるまでFLASHBACK TABLE ... TO BEFORE DROP文を繰り返し発行します。

Oracle Databaseは、元の表名を保持します。元の表が削除された後、同じスキーマ内に削除された表と同じ名前を持つ新しい表が作成されていた場合、RENAME TO句も指定しないかぎりエラーが戻されます。

RENAME TO句

この句を使用すると、ごみ箱から取り出される表に新しい名前を指定できます。

削除された表のフラッシュバックのノート

削除された表のフラッシュバックには、次のノートがあります。

  • ごみ箱から取り出された表に定義されたすべての索引(ビットマップ結合索引およびドメイン索引以外)が取り出されます。(ビットマップ結合索引およびドメイン索引はDROP TABLE操作中にごみ箱に移動しないため、取り出すことができません。)

  • 表に定義されたすべてのトリガーおよび制約も取り出されます。ただし、他の表を参照する参照整合制約は取り出されません。

    取り出された索引、トリガーおよび制約には、ごみ箱での名前が付けられています。そのため、FLASHBACK TABLE ... TO BEFORE DROP文を発行する前に、USER_RECYCLEBINビューを問い合せて、取り出されたトリガーおよび制約の名前を使用しやすい名前に変更することをお薦めします。

  • 表を削除すると、その表に定義されたすべてのマテリアライズド・ビュー・ログも削除されますが、これらはごみ箱には移動しません。そのため、マテリアライズド・ビュー・ログを表とともにフラッシュバックすることはできません。

  • 表を削除すると、その表の索引も削除され、表とともにごみ箱に移動します。その後領域が不足すると、領域を再利用するために、まずごみ箱内の索引が消去されます。この場合、表をフラッシュバックしても、その表に定義されていた索引の一部が戻されない場合があります。

  • ユーザーによって、または領域の再利用操作の結果として消去された表は、フラッシュバックできません。

以前の状態への表のリストア: 例

次の例では、新しい表employees_testを行の移動を有効にして作成し、新しい表内の値を更新し、FLASHBACK TABLE文を発行します。

hrサンプル・スキーマのemployees表から、employees_test表を、行の移動を有効にして作成します。

CREATE TABLE employees_test 
  AS SELECT * FROM employees;

指標として、2500未満の給与をリストします。

SELECT salary
  FROM employees_test
  WHERE salary < 2500;

    SALARY
----------
      2400
      2200
      2100
      2400
      2200

ノート:

FLASHBACK TABLE文によって使用されるマッピング表にSCNが伝播されるまで時間がかかるため、5分以上待ってから次の文を発行してください。この例で、既存の表を使用した場合は、この待機時間は必要ありません。

表の行の移動を可能にします。

ALTER TABLE employees_test
   ENABLE ROW MOVEMENT;

給与が2500未満の従業員の給与を10%上げます。

UPDATE employees_test
  SET salary = salary * 1.1
  WHERE salary < 2500;

5 rows updated.
COMMIT;

2つ目の指標として、10%の昇給後にも2500未満である給与をリストします。

SELECT salary
  FROM employees_test
  WHERE salary < 2500;

    SALARY
----------
      2420
      2310
      2420
  

employees_test表を、現在のシステム時間より前の状態にリストアします。この例では、一連の例を迅速にテストできるように、1分間(実際にはこのような短い期間は設定しない)を使用しています。通常の環境では、より長い期間が経過します。

FLASHBACK TABLE employees_test
  TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' minute);

2500未満の給与をリストします。前述のFLASHBACK TABLE文を発行したため、このリストは1つ目の指標リストと一致しています。

SELECT salary
  FROM employees_test
  WHERE salary < 2500;

    SALARY
----------
      2400
      2200
      2100
      2400
      2200

削除された表の取得: 例

次の文は、誤ってpm.print_media表を削除したときにそれを取得します。

FLASHBACK TABLE print_media TO BEFORE DROP;

pmスキーマ内に別のprint_media表が作成されていた場合、RENAME TO句を使用して、取り出された表の名前を変更します。

FLASHBACK TABLE print_media TO BEFORE DROP RENAME TO print_media_old;

複数回削除された従業員表を最も古い状態で取り出す必要がある場合、USER_RECYLEBIN表を問い合せてシステム生成名を判断し、その名前をFLASHBACK TABLE文で使用します。(ご使用のデータベースでのシステム生成名は、ここに示すものとは異なります。)

SELECT object_name, droptime FROM user_recyclebin 
   WHERE original_name = 'PRINT_MEDIA';

OBJECT_NAME                    DROPTIME
------------------------------ -------------------
RB$$45703$TABLE$0              2003-06-03:15:26:39
RB$$45704$TABLE$0              2003-06-12:12:27:27
RB$$45705$TABLE$0              2003-07-08:09:28:01