「うっかりDELETEしてCOMMITした」「DROP TABLEしてしまった」——Oracleには誤操作からデータを救う「Flashback」機能があります。本記事ではFlashback Query・Flashback Table・Flashback Dropの使い方を現場事例を交えて解説します。
目次
1. Oracleのフラッシュバック機能の種類 {#about}
| 機能 | できること | 必要な権限 |
|---|---|---|
| Flashback Query | 過去のデータをSELECT(変更なし) | FLASHBACK権限またはSELECT ANY TABLE |
| Flashback Table | テーブルを過去の状態に物理的に戻す | FLASHBACK ANY TABLE または FLASHBACK ON テーブル |
| Flashback Drop | DROP TABLEを取り消す(ごみ箱から復元) | DROP、CREATE権限 |
| Flashback Database | DB全体を過去時点に巻き戻す | SYSDBAまたはSYSBACKUP |
| Flashback Version Query | 行の変更履歴を時系列で確認 | FLASHBACK権限 |
2. 前提:UNDO_RETENTIONの確認 {#undo}
Flashback QueryやFlashback TableはUNDOデータを使います。UNDOが上書きされると過去の状態を取り出せません。
-- UNDO_RETENTION(秒)を確認
SHOW PARAMETER UNDO_RETENTION;
-- デフォルト900秒(15分)。本番では7200〜86400(2〜24時間)を推奨
-- UNDOテーブルスペースの設定を確認
SHOW PARAMETER UNDO_TABLESPACE;UNDO_RETENTIONを変更する(DBA作業):
-- 1時間(3600秒)に変更
ALTER SYSTEM SET UNDO_RETENTION = 3600 SCOPE=BOTH;UNDO_RETENTIONはあくまでヒント値です。UNDOテーブルスペースに空きがない場合は古いUNDOから上書きされます。
3. Flashback Query:過去の状態をSELECTで確認 {#flashback-query}
データを変更せずに、過去の時点のデータを「見るだけ」で確認できます。まずここから始めましょう。
タイムスタンプで過去のデータを参照
-- 1時間前の状態を確認
SELECT *
FROM EMPLOYEES
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR)
WHERE EMPLOYEE_ID = 100;
-- 特定時刻のデータを確認
SELECT *
FROM EMPLOYEES
AS OF TIMESTAMP TO_TIMESTAMP('2026-05-17 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
WHERE DEPT_ID = 10;SCN(システム変更番号)で過去のデータを参照
-- 現在のSCNを確認
SELECT CURRENT_SCN FROM V$DATABASE;
-- SCNを指定して参照(より正確)
SELECT *
FROM EMPLOYEES
AS OF SCN 1234567
WHERE EMPLOYEE_ID = 100;削除したデータを確認してリカバリ
-- 削除前のデータを過去の時点で確認
SELECT *
FROM EMPLOYEES
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE EMPLOYEE_ID = 200; -- 削除したレコード
-- 確認後、現在のテーブルにINSERT
INSERT INTO EMPLOYEES
SELECT *
FROM EMPLOYEES
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE EMPLOYEE_ID = 200;
COMMIT;4. Flashback Table:テーブルを過去の状態に戻す {#flashback-table}
テーブル全体を指定した時点の状態に戻します。ROW MOVEMENTが有効になっている必要があります。
事前設定:ROW MOVEMENTを有効化
-- テーブルにROW MOVEMENTを有効化(Flashback Tableの実行前に必要)
ALTER TABLE EMPLOYEES ENABLE ROW MOVEMENT;テーブルを過去の時点に戻す
-- 30分前の状態に戻す
FLASHBACK TABLE EMPLOYEES TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE);
-- 特定の時刻に戻す
FLASHBACK TABLE EMPLOYEES
TO TIMESTAMP TO_TIMESTAMP('2026-05-17 09:00:00', 'YYYY-MM-DD HH24:MI:SS');
-- SCNで指定
FLASHBACK TABLE EMPLOYEES TO SCN 1234567;注意:Flashback Tableはコミット済みトランザクションを取り消します。実行前に必ずFlashback Queryで対象データを確認してください。
複数テーブルを同時に戻す
-- 依存関係があるテーブルは同時に戻す(参照整合性を保つ)
FLASHBACK TABLE EMPLOYEES, DEPARTMENTS
TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);5. Flashback Drop:DROP TABLEを取り消す(ごみ箱) {#flashback-drop}
Oracleは DROP TABLE を実行してもテーブルをすぐに消去せず、ごみ箱(RECYCLEBIN) に移動します。
ごみ箱の確認
-- 自分のごみ箱を確認
SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE, DROPTIME, CAN_UNDROP
FROM RECYCLEBIN
ORDER BY DROPTIME DESC;出力例:
OBJECT_NAME ORIGINAL_NAME TYPE DROPTIME CAN_UNDROP
------------------------------ ------------- ----- -------------------- ----------
BIN$AbCdEf===$0 EMPLOYEES_OLD TABLE 2026-05-17:10:30:00 YES
BIN$XyZwVu===$0 DEPT_BACKUP TABLE 2026-05-16:15:00:00 YESテーブルをごみ箱から復元
-- 元のテーブル名で復元
FLASHBACK TABLE EMPLOYEES_OLD TO BEFORE DROP;
-- 別名で復元(元の名前で既に別テーブルがある場合)
FLASHBACK TABLE EMPLOYEES_OLD TO BEFORE DROP RENAME TO EMPLOYEES_OLD_RECOVERED;
-- ごみ箱内のオブジェクト名で直接指定
FLASHBACK TABLE "BIN$AbCdEf===$0" TO BEFORE DROP;ごみ箱を空にする(完全削除)
-- 自分のごみ箱を空にする
PURGE RECYCLEBIN;
-- 特定のテーブルだけ完全削除
PURGE TABLE EMPLOYEES_OLD;
-- DBA:全ユーザーのごみ箱を空にする
PURGE DBA RECYCLEBIN;ごみ箱を使わずに完全削除(PURGE句)
-- ごみ箱に移さず即時削除(復元不可)
DROP TABLE EMPLOYEES_OLD PURGE;6. Flashback Database:データベース全体を過去に戻す {#flashback-database}
DB全体を過去の時点に巻き戻す強力な機能です。フラッシュバックログが必要で、事前設定が必要です。
事前設定の確認
-- フラッシュバックDBが有効か確認
SELECT DB_UNIQUE_NAME, FLASHBACK_ON FROM V$DATABASE;
-- FLASHBACK_ON = YES であれば使用可能
-- フラッシュバックログの保存期間を確認
SHOW PARAMETER DB_FLASHBACK_RETENTION_TARGET;
-- 単位:分。デフォルト1440分(24時間)Flashback Databaseの実行(SYSDBAが必要)
-- 1. DBをマウント状態に
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
-- 2. 特定時刻まで巻き戻す
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2026-05-17 08:00:00', 'YYYY-MM-DD HH24:MI:SS');
-- または SCNで指定
FLASHBACK DATABASE TO SCN 1234567;
-- 3. DB をREAD ONLYで開いて確認
ALTER DATABASE OPEN READ ONLY;
-- 4. データを確認後、本番に戻す場合
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
RECOVER DATABASE; -- アーカイブログを適用(RESETLOGS前)
ALTER DATABASE OPEN RESETLOGS;警告:Flashback Databaseは取り消しが難しい操作です。必ずREAD ONLYで開いて確認してから本番に戻してください。
7. よくある失敗と注意点 {#caution}
ORA-01555:スナップショットが古すぎます
ORA-01555: スナップショットが古すぎます: ロールバック・セグメント番号XXX原因:参照しようとしている過去時点のUNDOが上書きされた。
対処:
- 過去に遡れる時間は
UNDO_RETENTIONの設定内に限られる - UNDOテーブルスペースを拡張し、UNDO_RETENTIONを延ばす
ROW MOVEMENT が有効でない
ORA-08189: Flashback Tableを実行できません。行移動が有効になっていないためですALTER TABLE EMPLOYEES ENABLE ROW MOVEMENT;ごみ箱機能が無効(RECYCLEBIN=OFF)
-- ごみ箱が有効か確認
SHOW PARAMETER RECYCLEBIN;
-- 有効化(セッションレベル)
ALTER SESSION SET RECYCLEBIN = ON;
-- 有効化(システムレベル)
ALTER SYSTEM SET RECYCLEBIN = ON SCOPE=BOTH;DROP TABLEと同名のテーブルが既に存在する
-- 既存のテーブルを別名でリネームしてから復元
ALTER TABLE EMPLOYEES RENAME TO EMPLOYEES_CURRENT;
FLASHBACK TABLE EMPLOYEES TO BEFORE DROP;8. まとめ:フラッシュバック機能の選び方チャート {#summary}
誤操作が発生!
│
├─ DROP TABLE してしまった
│ → Flashback Drop(ごみ箱から復元)
│
├─ DELETE/UPDATE して COMMIT した
│ ├─ 一部のデータだけ戻したい
│ │ → Flashback Query で確認 → INSERT で戻す
│ │
│ └─ テーブル全体を戻したい
│ → Flashback Table(ROW MOVEMENT が必要)
│
└─ DB全体を特定時点に戻したい
→ Flashback Database(SYSDBAが必要、事前設定必要)現場の鉄則:
- まず Flashback Query でデータを確認する(変更なし・リスクゼロ)
- データが確認できたら Flashback Table か INSERT でリカバリ
UNDO_RETENTIONの範囲外は対応不可 → 日常のバックアップが命綱
関連記事:









コメント