------------------------------------
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;
表已創(chuàng)建。
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)
當(dāng)一個(gè)表被刪除并移動(dòng)到"回收站"中,它的名字要進(jìn)行一些轉(zhuǎn)換.這樣的目的顯而易見是為了避免同類對象名稱的重復(fù).(windows上,經(jīng)過了特殊的處理,回收站里的操作系統(tǒng)文件可以重名.)
轉(zhuǎn)換后的名字格式如下:
rb$$objn$object_type$version
其中的rb,代表recycle bin. objn為表的目錄對象號. object_type表示對象類型. version表示版本號.
由數(shù)據(jù)庫指定。foo表被刪除后,在數(shù)據(jù)庫回收站里變成了rb$$41888$table$0 。從名字可以看出,這個(gè)對象的類型是table,version是0.
sql> create table foo as select * from dual;
表已創(chuàng)建。
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
sql>
能看出來,雖然源表名字相同,在回收站里的對象名字是不同的。
已經(jīng)放到回收站里的表是不能用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
對象已經(jīng)清掉.
恢復(fù)表,使用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 不存在
恢復(fù)后的表的名字為rb$$41889$table$0,如果指定名字,使用" as 表名字 "
如: undrop table rb$$41889$table$0 as foo這樣的語句.更為詳細(xì)的語法,請查閱10g的sql參考手冊.
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
sql>
如果我們這個(gè)時(shí)候再刪除rb$$41889$table$0,可觀察到回收站里該表版本號的變化。
如果空間一直夠用,回收站里的對象會(huì)一直保持(如果你不手工進(jìn)行purge的話)。如果空間不足,回收站里的對象會(huì)被清空。看我們下面這個(gè)例子:
讓我們創(chuàng)建一個(gè)大一點(diǎn)的表:
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;
表已創(chuàng)建。
sql> select table_name from user_tables;
table_name
------------------------------
foo_bigger
sql> select object_name, original_name from user_recyclebin;
未選定行
sql>
哦,果真,回收站里的內(nèi)容已經(jīng)被刪掉了。還要注意,在空間不足的時(shí)候drop表,也是不能放到回收站里的。
參考文檔:
oracle10i database administrator’s guide release 1 (10.1) - beta
part no. b10739-01
oracle10g的undrop功能一點(diǎn)實(shí)踐 by overmars
國內(nèi)最大的酷站演示中心!新聞熱點(diǎn)
疑難解答
圖片精選