S-JIS[2007-12-28/2010-02-19] 変更履歴

Oracle10g リサイクルビン

Oracle10gから、リサイクルビン(Recycle Bin:再利用する(びん))という ものが導入され、テーブル削除が面倒になった。[2005-05-26]
Flashback Dropという機能らしい)

今まではテーブルをDROPすると即テーブルが無くなったが、10gでは(デフォルトでは)リサイクルビンに入ることになり、そこから削除しないと消えない。
リサイクルビンに入っているテーブルは、user_tablesで見ると「BIN」で始まる変なテーブルとして見られる。
この名前を元に、元のテーブルに戻したり 完全に削除(PURGE)したりする。(リサイクルビン管理となったテーブルはDROPできない


リサイクルビンの確認

リサイクルビンに入れられたテーブルは、BINから始まるテーブル名になっている。

SQL> select table_name from user_tables where table_name like'BIN%';

TABLE_NAME
------------------------------
BIN$KGWUZUW7RLaF/azn7fs5Nw==$0

SQL*Plusのshowコマンドでリサイクルビンの内容を照会することが出来る。

SQL> show recyc
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TBL_HOGE         BIN$KGWUZUW7RLaF/azn7fs5Nw==$0 TABLE        2005-05-26:22:14:31

SQL*PlusのバージョンがOracle10gより前の場合はshowコマンドでは照会できない。

また、user_recyclebinやall_recyclebinビュー、あるいはrecyclebinシノニムで確認することも出来る。[/2010-02-19]

select * from recyclebin;
SQL> select object_name,original_name,type from user_recyclebin;

OBJECT_NAME                    ORIGINAL_NAME                    TYPE
------------------------------ -------------------------------- -------------------------
BIN$G1FeH97iTRWpR6GqWaneLQ==$0 PK_TBL_HOGE                      INDEX
BIN$KGWUZUW7RLaF/azn7fs5Nw==$0 TBL_HOGE                         TABLE

テーブルの復元

リサイクルビンに入れられたテーブルを復元する(元に戻す)方法。

flashback table 削除前テーブル名 to before drop;
flashback table "BIN〜" to before drop;

削除前のテーブル名を指定した場合、同名のテーブルが何度も削除されていたなら、一番直近のものが復元される。[2010-02-19]

SQL> flashback table "BIN$KGWUZUW7RLaF/azn7fs5Nw==$0" to before drop;

フラッシュバックが完了しました。

パージ(解放)

リサイクルビンに入れられたテーブルを完全に削除(領域を解放)する方法。

purge table 削除前テーブル名;
purge table "BIN〜";
purge user_recyclebin;
purge recyclebin;

削除前のテーブル名を指定した場合、同名のテーブルが何度も削除されていたなら、一番古い1件だけが削除される。[2010-02-19]

Oracle Database SQL言語リファレンスのSQL文: PURGE

SQL> purge user_recyclebin;

リサイクルビンがパージされました。

drop table文においてpurge句を指定すると、リサイクルビンに入れられずに直接削除される。

drop table テーブル名 purge;

SQL> drop table tbl_hoge purge;

表が削除されました。

SQL*PlusがOracle10gより前のバージョンの場合の注意

SQL*PlusがOracle9iであっても、Oracle10gのDBに接続することが出来る。[2007-12-13]

しかし10g独自の構文は、9iのSQL*Plusではエラーになる。
つまりshow recyclebinflashbackpurgeは使えない。

ただしuser_objectsを使う照会は可。
(「drop table テーブル名 purge;」も出来る…ちょっと不思議


テーブル削除へ戻る / SQLメモへ戻る / Oracle目次へ戻る / 新機能へ戻る / 技術メモへ戻る
メールの送信先:ひしだま