在oracle 10g中,引入了一個回收站(recycle bin)的概念.
回收站,從原理上來說就是一個數據字典表,放置用戶drop掉的數據庫對象信息.用戶進行drop操作的對象,并沒有被數據庫刪除,仍然會占用空間.除非是由于用戶手工進行purge或者因為存儲空間不夠而被數據庫清掉.數據庫有了這樣的功能,能夠減少很多不必要的麻煩.常常看到開發人員誤把表刪除,急急忙忙找dba來想辦法的情況,相信,隨著10g的大范圍應用,這種情形應該比較少見了.
dba管理上的相關信息可以從user_recyclebin(dba_recyclebin)中獲取.從現在的beta版本來看,手冊上所說的通過sql*plus的show recycle bin 命令查看還不可用.
為了便于測試,我們創建了一個表空間foo,大小為1m,創建了一個用戶foo,默認的表空間為foo.
sql>; connect foo/foo
已連接。
sql>; select table_name from user_tables;
未選定行
sql>; desc user_recyclebin
名稱 是否為空? 類型
user_recyclebin大多是自解釋的,涵義比較容易理解.
sql>; select object_name from user_recyclebin;
未選定行
sql>; create table foo as select * from dual;
表已創建。
sql>; select table_name from user_tables;
table_name
-----------------------------
foo
sql>; drop table foo;
表已丟棄。
sql>; select table_name from user_tables;
table_name
------------------------------
rb$$41888$table$0
sql>;
sql>; select object_name, original_name from user_recyclebin;
object_name original_name
-------------------- --------------------
rb$$41888$table$0 foo
sql>; desc rb$$41888$table$0
名稱 是否為空? 類型
----------------------------------------- -------- -------------
dummy varchar2(1)
當一個表被刪除并移動到"回收站"中,它的名字要進行一些轉換.這樣的目的顯而易見是為了避免同類對象名稱的重復.(windows上,經過了特殊的處理,回收站里的操作系統文件可以重名.)
轉換后的名字格式如下:
rb$$objn$object_type$version
其中的rb,代表recycle bin. objn為表的目錄對象號. object_type表示對象類型. version表示版本號.由數據庫指定。foo表被刪除后,在數據庫回收站里變成了rb$$41888$table$0 。從名字可以看出,這個對象的類型是table,version是0.
sql>; create table foo as select * from dual;
表已創建。
sql>; select table_name from user_tables;
table_name
------------------------------
foo
rb$$41888$table$0
sql>; drop table foo;
表已丟棄。
sql>; select object_name, original_name from user_recyclebin;
object_name original_name
-------------------- --------------------
rb$$41889$table$0 foo
rb$$41888$table$0 foo
能看出來,雖然源表名字相同,在回收站里的對象名字是不同的。
已經放到回收站里的表是不能用drop 命令刪除的:
sql>; drop table rb$$41888$table$0;
drop table rb$$41888$table$0
*
error 位于第 1 行:
ora-38301: can not perform ddl/dml over objects in recycle bin
如果要清掉改對象,使用purge命令:
sql>; purge table rb$$41888$table$0;
table purged.
sql>; select object_name, original_name from user_recyclebin;
object_name original_name
-------------------- --------------------
rb$$41889$table$0 foo
對象已經清掉.
恢復表,使用undrop命令.
sql>; undrop table rb$$41889$table$0;
table undropped.
sql>; select object_name, original_name from user_recyclebin;
未選定行
sql>; select table_name from user_tables;
table_name
------------------------------
rb$$41889$table$0
sql>; desc foo;
error:
ora-04043: 對象 foo 不存在
恢復后的表的名字為rb$$41889$table$0,如果指定名字,使用" as 表名字 "如: undrop table rb$$41889$table$0 as foo這樣的語句.更為詳細的語法,請查閱10g的sql參考手冊.
sql>; desc rb$$41889$table$0;
名稱 是否為空? 類型
dummy varchar2(1)
sql>; drop table rb$$41889$table$0;
表已丟棄。
sql>; select table_name from user_tables;
table_name
------------------------------
rb$$41889$table$1
如果我們這個時候再刪除rb$$41889$table$0,可觀察到回收站里該表版本號的變化。
如果空間一直夠用,回收站里的對象會一直保持(如果你不手工進行purge的話)。如果空間不足,回收站里的對象會被清空。看我們下面這個例子:
讓我們創建一個大一點的表:
sql>; select object_name from user_recyclebin;
object_name
rb$$41893$table$0
sql>; create table foo_bigger as select * from all_objects where rownum<7980;
表已創建。
sql>; select table_name from user_tables;
table_name
------------------------------
foo_bigger
sql>; select object_name, original_name from user_recyclebin;
未選定行
哦,果真,回收站里的內容已經被刪掉了。還要注意,在空間不足的時候drop表,也是不能放到回收站里的。
新聞熱點
疑難解答