Oracle DROP TABLEとフラッシュバックドロップ:削除した表を復元する方法

Oracle Master Silver

データベース管理において、「誤って重要な表を DROP TABLE で削除してしまった」というミスは、冷や汗が出る瞬間です。しかし、Oracle Database には、Windows や Mac の「ごみ箱」のように、削除した表を一時的に保持し、簡単に復元できる フラッシュバックドロップ (Flashback Drop) 機能が備わっています。

本記事では、Oracle Database 19c を対象に、基本の削除コマンドから、ごみ箱(Recycle Bin)の仕組み、そして万が一の際の復元手順までを、実機で動く SQL 例とともに解説します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


【結論】削除と復元の最短コマンドリスト

急いでいる方向けに、よく使うコマンドをまとめました。

  • 表をごみ箱へ入れる(通常の削除)SQLDROP TABLE テーブル名;
  • 削除した表を復元する(フラッシュバックドロップ)SQLFLASHBACK TABLE テーブル名 TO BEFORE DROP;
  • ごみ箱を経由せず完全に削除する(復元不可)SQLDROP TABLE テーブル名 PURGE;
  • ごみ箱の中身を確認するSQLSELECT * FROM user_recyclebin; -- または SQL*Plusコマンド SHOW RECYCLEBIN;

1. フラッシュバックドロップとは?

フラッシュバックドロップとは、DROP TABLE 文によって削除された表を、Oracle の「ごみ箱(Recycle Bin)」から元の状態に戻す機能です。

仕組みと特徴

  • 論理的な削除: 通常の DROP TABLE を実行しても、データファイル上の領域は即座には解放されません。単にデータディクショナリ上で「表の名前」が書き換わり、管理上「ごみ箱」に移動した扱いになります。
  • 依存オブジェクトも保護: 表に付随するインデックスや制約(外部キー制約を除く)も一緒にごみ箱へ移動し、復元時に戻ってきます。
  • デフォルトで有効: Standard Edition 2 (SE2) でも Enterprise Edition (EE) でも、通常はデフォルトで有効化されています。

2. 【実践】表の削除と復元手順

実際にテスト用の表を作成し、削除してから復元するまでの流れをステップ・バイ・ステップで確認します。

前提条件

  • OS: Oracle Linux または Windows
  • DB: Oracle Database 19c (CDB/PDB または Non-CDB)
  • ユーザー: 一般ユーザー(RESOURCE 権限等を持つ)
    • 注意: SYS ユーザー(SYSDBA)で作成した表はごみ箱機能の対象外です。必ず一般ユーザーで実施してください。

手順1: テスト用データの作成

まず、実験用の employees_demo 表を作成し、データを投入します。

-- テーブル作成
CREATE TABLE employees_demo (
    emp_id NUMBER PRIMARY KEY,
    emp_name VARCHAR2(50),
    dept_no NUMBER
);

-- データ投入
INSERT INTO employees_demo VALUES (101, 'Alice', 10);
INSERT INTO employees_demo VALUES (102, 'Bob', 20);
COMMIT;

-- データ確認
SELECT * FROM employees_demo;

手順2: 表の削除(DROP TABLE)

DROP TABLE 文を実行して表を削除します。PURGE オプションを付けない限り、表はごみ箱へ移動します。

DROP TABLE employees_demo;

実行結果: Table dropped.

この時点で SELECT * FROM employees_demo; を実行すると、「ORA-00942: 表またはビューが存在しません」となります。

SQL> SELECT * FROM employees_demo;

EMP_ID EMP_NAME DEPT_NO
---------- -------------------- ----------
101 Alice 10
102 Bob 20

SQL> DROP TABLE employees_demo;

Table dropped.

SQL> SELECT * FROM employees_demo;
SELECT * FROM employees_demo
*
ERROR at line 1:
ORA-00942: table or view does not exist

手順3: ごみ箱(Recycle Bin)の確認

表が本当にごみ箱にあるか確認します。user_recyclebin ビューを参照するか、SQL*Plus の SHOW コマンドを使います。

-- ごみ箱の中身を表示
SELECT object_name, original_name, type, droptime 
FROM user_recyclebin;

実行結果の例:

SQL> SELECT object_name, original_name, type, droptime
2 FROM user_recyclebin;

OBJECT_NAME ORIGINAL_NAME TYPE DROPTIME
---------------------------------------- -------------------- ---------- -------------------
BIN$Rl6XAo07CnzgZaP6z6C6Kw==$0 SYS_C007537 INDEX 2025-12-20:03:00:39
BIN$Rl6XAo08CnzgZaP6z6C6Kw==$0 EMPLOYEES_DEMO TABLE 2025-12-20:03:00:39
  • ORIGINAL_NAME: 元のテーブル名 (EMPLOYEES_DEMO)
  • OBJECT_NAME: ごみ箱内でのシステム生成名(BIN$ で始まる名前)

手順4: 表の復元(FLASHBACK TABLE)

フラッシュバックドロップ機能を使って、表を削除直前の状態に戻します。

FLASHBACK TABLE employees_demo TO BEFORE DROP;

実行結果: Flashback complete.

復元後、再度データを検索して元通りになっているか確認してください。

SELECT * FROM employees_demo;
SQL> FLASHBACK TABLE employees_demo TO BEFORE DROP;

Flashback complete.

SQL> SELECT * FROM employees_demo;

EMP_ID EMP_NAME DEPT_NO
---------- -------------------- ----------
101 Alice 10
102 Bob 20

SQL> SELECT object_name, original_name, type, droptime
2 FROM user_recyclebin;

no rows selected

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


3. 完全削除(PURGE)とごみ箱の管理

ディスク領域を空けたい場合や、機密情報のため完全に消去したい場合は、ごみ箱を使わずに削除するか、ごみ箱を空にする操作が必要です。

PURGE オプション付き削除

初めからごみ箱に残さない場合に使用します。この操作は取り消せません。

DROP TABLE employees_demo PURGE;

ごみ箱の手動パージ

ごみ箱に溜まったオブジェクトを削除して領域を解放します。

  • 特定の表だけをごみ箱から消すSQLPURGE TABLE employees_demo;
  • 自分のごみ箱をすべて空にするSQLPURGE RECYCLEBIN;
  • (管理者用)全ユーザーのごみ箱を空にするSQLPURGE DBA_RECYCLEBIN;

4. トラブルシューティングと注意点

よくあるエラーと対処

エラー原因対処
ORA-38305: オブジェクトがごみ箱にありません既に PURGE されたか、SYS ユーザーで削除した、あるいは領域不足で自動パージされた。復元は不可(RMAN バックアップからのリストアが必要)。
ORA-00955: すでに使用されている名前です復元しようとした表と同じ名前の表が既に再作成されている。RENAME TO オプションを使って別名で復元する(後述 FAQ 参照)。

重要な運用上の注意

  1. 領域不足時の自動パージ表領域の空き容量が不足してくると、Oracle は新しいデータのために、古いごみ箱のオブジェクトから自動的に削除(パージ) します。「ごみ箱にあるから安心」と思って放置していると、いつの間にか消えていることがあります。
  2. SYSTEM 表領域の制限SYSTEM 表領域に作成されたオブジェクトは、ごみ箱機能の対象外です。
  3. SYS ユーザーSYS ユーザー(SYSDBA 権限)でログインして所有している表を削除した場合、ごみ箱には入らず即座に完全削除されます。

5. よくある質問(FAQ)

Q1. 同名の表を新しく作ってしまいましたが、削除した古い表を復元できますか?

A. はい、リネームして復元可能です。

削除後に同名の表 employees_demo を新規作成してしまった場合、そのまま復元すると名前が衝突します。以下のように別名を指定して復元してください。

FLASHBACK TABLE employees_demo TO BEFORE DROP 
RENAME TO employees_demo_old;

Q2. インデックスや制約も元に戻りますか?

A. はい、基本的には戻ります。

ただし、インデックスや制約の名前は元の名前には戻らず、BIN$… というシステム生成名のままになることがあります。必要に応じて、復元後に ALTER INDEX … RENAME TO … で名前を修正することをお勧めします。

※ 参照整合性制約(外部キー)は復元されないため、手動で再定義が必要です。

Q3. ごみ箱機能が有効か確認するには?

A. recyclebin パラメータを確認します。

SHOW PARAMETER recyclebin

値が on であれば有効です。無効 (off) の場合は、ALTER SYSTEM SET recyclebin = ON; で有効化できます(反映には再接続が必要な場合があります)。


6. まとめ

  • DROP TABLE は通常ごみ箱へ移動するだけなので、FLASHBACK TABLE で復元が可能。
  • 完全に消したい場合は PURGE オプションを使う。
  • SYS ユーザーSYSTEM 表領域のオブジェクトはごみ箱に入らないので注意。
  • 領域不足になるとごみ箱内の古いオブジェクトから自動的に消されるため、過信は禁物。

復旧手段を知っておくことは、安全なデータベース運用の第一歩です。まずは開発環境で CREATEDROPFLASHBACK の流れを実際に試してみてください。


本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。


[参考]
Oracle Database SQL言語リファレンス 19c

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました