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を記録しておくことをお薦めします。
関連項目:
-
UNDO_RETENTION
初期化パラメータを設定するには、最小UNDO保存期間の設定を参照してください -
データベース全体を以前の状態に戻す方法の詳細は、「FLASHBACK DATABASE」を参照してください。
-
表から過去のデータを取り出す方法の詳細は、「
SELECT
」の「flashback_query_clause」を参照してください。 -
FLASHBACK
TABLE
文を使用する方法の詳細は、『Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド』を参照してください。
前提条件
表を以前のSCNまたはタイムスタンプまでフラッシュバックするには、その表に対するFLASHBACK
オブジェクト権限か、FLASHBACK
ANY
TABLE
システム権限が必要です。また、表に対するREAD
またはSELECT
オブジェクト権限と表に対するINSERT
、DELETE
および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