本番環境で誤ってDELETEやUPDATEを実行してしまった――そんな緊急事態でもバックアップからのリストアに頼らず、短時間でデータを復旧できるのがOracleのフラッシュバック(Flashback)機能です。UNDOデータを活用して「過去の時点のデータ」を参照したり、テーブルを丸ごと巻き戻したり、DROP TABLEを取り消したりと、複数のレベルで復旧手段が用意されています。本記事では各フラッシュバック機能の構文・使いどころ・制限事項を体系的に解説します。
- Flashback Query(AS OF TIMESTAMP / AS OF SCN)で過去のデータを参照する方法
- Flashback Version Query(VERSIONS BETWEEN)で行の変更履歴を追跡する方法
- Flashback Table でテーブルを過去の状態に巻き戻す方法
- Flashback Drop で DROP TABLE を取り消す方法(ごみ箱機能)
- Flashback Transaction Query でトランザクション単位の変更を確認する方法
- 誤 DELETE / UPDATE からのデータ復旧の実務パターン
- UNDO 保持期間(UNDO_RETENTION)と ORA-01555 の関係
- フラッシュバックの種類と選び方
- Flashback Query(AS OF TIMESTAMP / AS OF SCN)
- 実務パターン:誤 DELETE からのデータ復旧
- 実務パターン:誤 UPDATE からのデータ復旧
- Flashback Version Query(VERSIONS BETWEEN)
- Flashback Table ── テーブルを過去の状態に巻き戻す
- Flashback Drop ── DROP TABLE を取り消す
- Flashback Transaction Query ── トランザクション単位の確認
- UNDO保持期間と ORA-01555 の関係
- 各フラッシュバック機能の使い分けフローチャート
- まとめ
フラッシュバックの種類と選び方
Oracleのフラッシュバック機能は複数のレベルで提供されています。状況に応じて適切なものを選びます。
| 機能 | 対象範囲 | 主な用途 | 要件 |
|---|---|---|---|
| Flashback Query | SELECT文 | 過去の時点のデータを参照する | UNDOデータが残っていること |
| Flashback Version Query | 行の変更履歴 | 特定行がいつ・どう変わったか追跡する | UNDOデータが残っていること |
| Flashback Table | テーブル全体 | テーブルを過去の状態に巻き戻す | 行移動の有効化が必要 |
| Flashback Drop | DROP TABLE | 誤って削除したテーブルを復元する | ごみ箱(Recyclebin)が有効 |
| Flashback Transaction | トランザクション | 特定トランザクションの変更を確認・取消する | 補足ログの有効化が必要 |
| Flashback Database | データベース全体 | データベースを過去の時点に巻き戻す | フラッシュバックログ領域(FRA)の構成 |
本記事では実務で特に使用頻度の高いFlashback Query・Flashback Version Query・Flashback Table・Flashback Dropを中心に解説します。
Flashback Query(AS OF TIMESTAMP / AS OF SCN)
最も手軽に使えるフラッシュバック機能です。SELECT文に AS OF 句を追加するだけで、過去の時点のデータを参照できます。テーブル構造の変更は不要で、特別な権限も通常は不要です。
AS OF TIMESTAMP ── 時刻指定で過去データを取得する
-- 30分前の時点の employees テーブルを参照 SELECT employee_id, name, salary FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE) WHERE department_id = 10;
-- 2026年3月29日 14:00:00 時点のデータを参照
SELECT employee_id, name, salary
FROM employees AS OF TIMESTAMP
TO_TIMESTAMP('2026-03-29 14:00:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE department_id = 10;
AS OF SCN ── SCN(System Change Number)で指定する
SCNはOracleが内部的に採番する変更番号で、タイムスタンプよりも正確に時点を指定できます。タイムスタンプは約3秒の誤差がありますが、SCNは一意です。
SELECT CURRENT_SCN FROM V$DATABASE; -- 例: 12345678
-- 操作前に控えておいたSCNを使って復旧 SELECT employee_id, name, salary FROM employees AS OF SCN 12345678 WHERE department_id = 10;
大量の UPDATE や DELETE を実行する前に
SELECT CURRENT_SCN FROM V$DATABASE で SCN を控えておくと、万一の誤操作時に正確な時点を指定してフラッシュバックできます。運用手順書に組み込むことを推奨します。
実務パターン:誤 DELETE からのデータ復旧
Flashback Query で過去のデータを参照し、INSERT INTO ... SELECT で復元するのが最も実用的な復旧手順です。
-- ステップ 1: 削除前のSCNがわかっている場合 -- まず、復旧対象のデータを確認する SELECT * FROM employees AS OF SCN 12345678 WHERE department_id = 10; -- ステップ 2: 確認できたら INSERT で復元する INSERT INTO employees (employee_id, name, salary, department_id) SELECT employee_id, name, salary, department_id FROM employees AS OF SCN 12345678 WHERE department_id = 10 AND employee_id NOT IN (SELECT employee_id FROM employees); -- 既存行との重複を排除 COMMIT;
実務パターン:誤 UPDATE からのデータ復旧
UPDATE で値を誤って上書きした場合も、Flashback Query で過去の正しい値を取得して MERGE で戻せます。
-- 「全社員の salary を誤って 0 に UPDATE してしまった」場合の復旧
MERGE INTO employees e
USING (
SELECT employee_id, salary
FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR)
) old ON (e.employee_id = old.employee_id)
WHEN MATCHED THEN
UPDATE SET e.salary = old.salary;
COMMIT;
Flashback Version Query(VERSIONS BETWEEN)
特定の行が「いつ・どのように変更されたか」をトランザクション単位で追跡できる機能です。データの変更履歴を調査するときに使います。
SELECT
employee_id,
name,
salary,
VERSIONS_STARTTIME AS changed_at, -- この版が有効になった時刻
VERSIONS_ENDTIME AS replaced_at, -- この版が次の版に置き換わった時刻(NULLなら現在有効)
VERSIONS_OPERATION AS op, -- I=INSERT, U=UPDATE, D=DELETE
VERSIONS_XID AS transaction_id -- トランザクションID
FROM employees
VERSIONS BETWEEN TIMESTAMP
TO_TIMESTAMP('2026-03-29 09:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND SYSTIMESTAMP
WHERE employee_id = 1001
ORDER BY VERSIONS_STARTTIME;
| 擬似列 | 説明 |
|---|---|
VERSIONS_STARTTIME |
この版のデータが有効になった時刻 |
VERSIONS_ENDTIME |
この版が次の版に置き換わった時刻(NULLなら現在有効) |
VERSIONS_STARTSCN |
この版が有効になった SCN |
VERSIONS_ENDSCN |
この版が終了した SCN |
VERSIONS_OPERATION |
操作種別(I=INSERT, U=UPDATE, D=DELETE) |
VERSIONS_XID |
変更を行ったトランザクションの ID |
「誰がいつこのデータを変更したのか」を調べたいとき、UNDOデータが残っていればフラッシュバックだけで調査できます。監査ログが設定されていない場合でも、UNDO保持期間内であれば変更追跡が可能です。
-- SCN 範囲を指定して変更履歴を取得する
SELECT
employee_id,
name,
salary,
VERSIONS_STARTSCN,
VERSIONS_ENDSCN,
VERSIONS_OPERATION AS op
FROM employees
VERSIONS BETWEEN SCN 12345000 AND 12346000
WHERE employee_id = 1001
ORDER BY VERSIONS_STARTSCN;
Flashback Table ── テーブルを過去の状態に巻き戻す
テーブル全体を指定した時点の状態に巻き戻す機能です。大量の行を誤って変更した場合、INSERT ... SELECT で1行ずつ復元するよりもテーブルごと巻き戻すほうが確実かつ高速です。
事前準備:行移動(ROW MOVEMENT)の有効化
Flashback Table を実行するには、対象テーブルの行移動を事前に有効にしておく必要があります。
ALTER TABLE employees ENABLE ROW MOVEMENT; -- これにより Oracle は物理的な ROWID を変更できるようになる -- Flashback Table 完了後に無効に戻すことも可能
Flashback Table の実行
FLASHBACK TABLE employees
TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE);
FLASHBACK TABLE employees
TO SCN 12345678;
- DDL(ALTER TABLE ADD COLUMN 等)が実行された後はフラッシュバック不可
- TRUNCATE TABLE の後はフラッシュバック不可(UNDO が生成されないため)
- テーブルに依存するトリガーは無効化される場合がある
- ROW MOVEMENT が無効だと ORA-08189 が発生する
- UNDOデータが期限切れの場合は ORA-01555: snapshot too old になる
Flashback Drop ── DROP TABLE を取り消す
Oracle 10g 以降、DROP TABLE を実行してもテーブルは即座に削除されず、「ごみ箱(Recyclebin)」に移動されます。ごみ箱の領域が不足しない限り、ここから復元できます。
ごみ箱の確認
-- ごみ箱に入っているオブジェクト一覧
SELECT
object_name, -- ごみ箱内での名前(BIN$...形式)
original_name, -- 元のテーブル名
type, -- TABLE / INDEX 等
droptime, -- DROP された日時
can_undrop -- YES=復元可能, NO=不可
FROM user_recyclebin
ORDER BY droptime DESC;
テーブルの復元(FLASHBACK TABLE … TO BEFORE DROP)
-- 元のテーブル名で復元する FLASHBACK TABLE employees TO BEFORE DROP; -- テーブル名が既に別のテーブルに使われている場合、リネームして復元 FLASHBACK TABLE employees TO BEFORE DROP RENAME TO employees_restored;
ごみ箱を空にする(完全削除)
-- 特定テーブルをごみ箱から完全削除(復元不可になる) PURGE TABLE employees; -- 自分のごみ箱を全て空にする PURGE RECYCLEBIN; -- DBA権限で全ユーザーのごみ箱を空にする PURGE DBA_RECYCLEBIN; -- DROP時にごみ箱を経由せず即座に完全削除する DROP TABLE employees PURGE;
PURGE を実行すると完全に削除され、フラッシュバックでの復元はできなくなります。本番環境では DROP TABLE ... PURGE は慎重に使ってください。
Flashback Transaction Query ── トランザクション単位の確認
FLASHBACK_TRANSACTION_QUERY ビューを使うと、特定のトランザクションが行った全ての変更と取消SQLを確認できます。Flashback Version Query で取得した VERSIONS_XID からトランザクションの詳細を深堀りする使い方が一般的です。
事前準備:補足ログの有効化
-- 最小補足ログを有効にする(DBA権限が必要) ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -- 確認 SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE; -- YES なら有効
-- VERSIONS_XID で取得したトランザクションIDを使って詳細を調べる
SELECT
xid,
operation, -- INSERT / UPDATE / DELETE
table_name,
undo_sql -- この変更を取り消すためのSQL文
FROM flashback_transaction_query
WHERE xid = HEXTORAW('0007001C00000123'); -- VERSIONS_XID の値を指定
undo_sql 列にはその変更を取り消すためのSQL文(INSERT・UPDATE・DELETE)が自動生成されます。これをそのまま実行することで、特定のトランザクションの影響を元に戻せます。
UNDO保持期間と ORA-01555 の関係
フラッシュバック機能はすべてUNDOデータに依存しています。UNDOデータが上書きされると過去のデータは参照できなくなるため、保持期間の設定が極めて重要です。
-- 現在の UNDO 保持期間を確認する(秒数) SHOW PARAMETER undo_retention; -- 例: 900(15分)= デフォルト -- UNDO 保持期間を1時間に延長する ALTER SYSTEM SET undo_retention = 3600 SCOPE=BOTH; -- UNDO 表領域の保証(RETENTION GUARANTEE)を有効にする -- これにより UNDO_RETENTION 以内のデータは上書きされなくなる ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
| 設定 | 説明 | 注意点 |
|---|---|---|
UNDO_RETENTION |
UNDOデータの保持目標時間(秒) | あくまで「目標」であり、UNDO領域が不足すれば期限前でも上書きされる |
RETENTION GUARANTEE |
UNDO_RETENTION期間中のUNDOデータを保証する | UNDO表領域が不足するとDML自体が失敗する可能性がある |
RETENTION NOGUARANTEE |
保持を保証しない(デフォルト) | 領域が不足するとUNDOが早期に上書きされる |
-- UNDO 表領域のサイズと使用率を確認
SELECT
tablespace_name,
ROUND(SUM(bytes) / 1024 / 1024) AS total_mb,
ROUND(SUM(CASE WHEN status = 'ACTIVE' THEN bytes ELSE 0 END) / 1024 / 1024) AS active_mb,
ROUND(SUM(CASE WHEN status = 'UNEXPIRED' THEN bytes ELSE 0 END) / 1024 / 1024) AS unexpired_mb,
ROUND(SUM(CASE WHEN status = 'EXPIRED' THEN bytes ELSE 0 END) / 1024 / 1024) AS expired_mb
FROM dba_undo_extents
GROUP BY tablespace_name;
フラッシュバックで指定した時点のUNDOデータが既に上書きされている場合、このエラーが発生します。対処法としては (1) UNDO_RETENTION を延長する、(2) UNDO表領域を拡大する、(3) RETENTION GUARANTEE を有効にする、のいずれかを検討してください。UNDO表領域の容量管理については「【Oracle】容量不足の緊急対応完全ガイド」も参考にしてください。
各フラッシュバック機能の使い分けフローチャート
| やりたいこと | 使う機能 | コマンド例 |
|---|---|---|
| 過去のデータを見たい(SELECTだけ) | Flashback Query | SELECT ... FROM t AS OF TIMESTAMP ... |
| 行がいつ変わったか追跡したい | Flashback Version Query | SELECT ... FROM t VERSIONS BETWEEN ... |
| 誤DELETE/UPDATEを元に戻したい | Flashback Query + INSERT/MERGE | INSERT INTO t SELECT ... FROM t AS OF ... |
| テーブル全体を巻き戻したい | Flashback Table | FLASHBACK TABLE t TO TIMESTAMP ... |
| DROP TABLEを取り消したい | Flashback Drop | FLASHBACK TABLE t TO BEFORE DROP |
| 特定トランザクションの影響を調べたい | Flashback Transaction | SELECT ... FROM FLASHBACK_TRANSACTION_QUERY ... |
まとめ
Oracleのフラッシュバック機能は、UNDOデータを活用して過去のデータへのアクセスや復旧を可能にする強力なツール群です。
- Flashback Query:SELECT文に
AS OF TIMESTAMPまたはAS OF SCNを付けるだけで過去のデータを参照できる最も手軽な方法 - Flashback Version Query:
VERSIONS BETWEENで行の変更履歴をトランザクション単位で追跡できる。VERSIONS_OPERATIONでINSERT/UPDATE/DELETEの種別がわかる - Flashback Table:テーブル全体を過去の状態に戻す。事前に
ENABLE ROW MOVEMENTが必要。DDLやTRUNCATEの後は使用不可 - Flashback Drop:DROP TABLEをごみ箱(Recyclebin)から復元する。
FLASHBACK TABLE ... TO BEFORE DROPで取消可能 - Flashback Transaction:
FLASHBACK_TRANSACTION_QUERYビューで取消SQLを自動生成できる。補足ログの有効化が必要 - すべてのフラッシュバック機能は UNDO データに依存するため、
UNDO_RETENTIONの適切な設定とUNDO表領域の容量管理が重要 - 大規模な DML 実行前に
SELECT CURRENT_SCN FROM V$DATABASEで SCN を記録しておくと、復旧時に正確な時点を指定できる

