【Oracle】フラッシュバックの使い方完全ガイド|AS OF TIMESTAMP・Flashback Table・Flashback Drop・誤操作からのデータ復旧

【Oracle】フラッシュバックの使い方完全ガイド|AS OF TIMESTAMP・Flashback Table・Flashback Drop・誤操作からのデータ復旧 Oracle

本番環境で誤ってDELETEUPDATEを実行してしまった――そんな緊急事態でもバックアップからのリストアに頼らず、短時間でデータを復旧できるのが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 の関係
スポンサーリンク

フラッシュバックの種類と選び方

Oracleのフラッシュバック機能は複数のレベルで提供されています。状況に応じて適切なものを選びます。

機能 対象範囲 主な用途 要件
Flashback Query SELECT文 過去の時点のデータを参照する UNDOデータが残っていること
Flashback Version Query 行の変更履歴 特定行がいつ・どう変わったか追跡する UNDOデータが残っていること
Flashback Table テーブル全体 テーブルを過去の状態に巻き戻す 行移動の有効化が必要
Flashback Drop DROP TABLE 誤って削除したテーブルを復元する ごみ箱(Recyclebin)が有効
Flashback Transaction トランザクション 特定トランザクションの変更を確認・取消する 補足ログの有効化が必要
Flashback Database データベース全体 データベースを過去の時点に巻き戻す フラッシュバックログ領域(FRA)の構成

本記事では実務で特に使用頻度の高いFlashback QueryFlashback Version QueryFlashback TableFlashback Dropを中心に解説します。

Flashback Query(AS OF TIMESTAMP / AS OF SCN)

最も手軽に使えるフラッシュバック機能です。SELECT文に AS OF 句を追加するだけで、過去の時点のデータを参照できます。テーブル構造の変更は不要で、特別な権限も通常は不要です。

AS OF TIMESTAMP ── 時刻指定で過去データを取得する

Flashback Query ── 30分前のデータを取得する
-- 30分前の時点の employees テーブルを参照
SELECT employee_id, name, salary
FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE department_id = 10;
Flashback Query ── 特定の日時を直接指定する
-- 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は一意です。

現在のSCNを確認する
SELECT CURRENT_SCN FROM V$DATABASE;
-- 例: 12345678
Flashback Query ── SCN指定で過去データを取得する
-- 操作前に控えておいたSCNを使って復旧
SELECT employee_id, name, salary
FROM employees AS OF SCN 12345678
WHERE department_id = 10;
SCN を事前に記録しておく習慣
大量の UPDATE や DELETE を実行する前に SELECT CURRENT_SCN FROM V$DATABASE で SCN を控えておくと、万一の誤操作時に正確な時点を指定してフラッシュバックできます。運用手順書に組み込むことを推奨します。

実務パターン:誤 DELETE からのデータ復旧

Flashback Query で過去のデータを参照し、INSERT INTO ... SELECT で復元するのが最も実用的な復旧手順です。

誤 DELETE からの復旧手順
-- ステップ 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 で戻せます。

誤 UPDATE からの復旧手順(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)

特定の行が「いつ・どのように変更されたか」をトランザクション単位で追跡できる機能です。データの変更履歴を調査するときに使います。

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
VERSIONS BETWEEN の活用シーン
「誰がいつこのデータを変更したのか」を調べたいとき、UNDOデータが残っていればフラッシュバックだけで調査できます。監査ログが設定されていない場合でも、UNDO保持期間内であれば変更追跡が可能です。
VERSIONS BETWEEN ── SCN指定での変更履歴取得
-- 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 ── テーブルを30分前の状態に戻す
FLASHBACK TABLE employees
    TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE);
Flashback Table ── SCN指定で戻す
FLASHBACK TABLE employees
    TO SCN 12345678;
Flashback Table の制限事項

  • 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)

DROP TABLE を取り消す
-- 元のテーブル名で復元する
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 は取り消せません
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 なら有効
トランザクションの変更内容と取消SQLを取得する
-- 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_RETENTION の確認と変更
-- 現在の 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 表領域の使用状況を確認する
-- 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;
ORA-01555: snapshot too old
フラッシュバックで指定した時点の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 QueryVERSIONS BETWEEN で行の変更履歴をトランザクション単位で追跡できる。VERSIONS_OPERATION でINSERT/UPDATE/DELETEの種別がわかる
  • Flashback Table:テーブル全体を過去の状態に戻す。事前に ENABLE ROW MOVEMENT が必要。DDLやTRUNCATEの後は使用不可
  • Flashback Drop:DROP TABLEをごみ箱(Recyclebin)から復元する。FLASHBACK TABLE ... TO BEFORE DROP で取消可能
  • Flashback TransactionFLASHBACK_TRANSACTION_QUERY ビューで取消SQLを自動生成できる。補足ログの有効化が必要
  • すべてのフラッシュバック機能は UNDO データに依存するため、UNDO_RETENTION の適切な設定とUNDO表領域の容量管理が重要
  • 大規模な DML 実行前に SELECT CURRENT_SCN FROM V$DATABASE で SCN を記録しておくと、復旧時に正確な時点を指定できる