OracleのFlashback機能で誤操作・削除データを復元する方法

当ページのリンクには広告が含まれています。

「うっかり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 DropDROP TABLEを取り消す(ごみ箱から復元)DROP、CREATE権限
Flashback DatabaseDB全体を過去時点に巻き戻す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が必要、事前設定必要)

現場の鉄則:

  1. まず Flashback Query でデータを確認する(変更なし・リスクゼロ)
  2. データが確認できたら Flashback TableINSERT でリカバリ
  3. UNDO_RETENTION の範囲外は対応不可 → 日常のバックアップが命綱

関連記事:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITの事や自分の経験談など綴っていきたいと思っています。

コメント

コメントする

CAPTCHA


目次