關于recycle bin
一、 recycle bin官方文檔
the recycle bin is a data dictionary table containing information about dropped objects. dropped objects and any dependent objects (such as indexes, constraints, nested tables, and so on) are not removed and still occupy space until you purge them from the
recycle bin or until they are automatically purged by the database when available space becomes low.
you can restore objects from the recycle bin, which is equivalent to "undropping" them. when you restore an object, it is returned to the state that it was in before the drop operation. when you restore a table, all of the table's dependent objects are also
automatically restored.
bin)的資料庫對象。 資源回收筒,從原理上來說就是一個資料字典表,放置使用者drop掉的資料庫對象資訊。使用者進行drop操作的對象并沒有被資料庫删除,仍然會占用空間。除非是由于使用者手工進行purge或者因為存儲空間不夠而被資料庫清掉。
可以使用restore指令恢複對象到它被drop掉之前的樣子,當使用restore恢複對象時,和該對象關聯的索引、限制等對象都會自動恢複。
二、 打開關閉資源回收筒功能
sql> show parameter recyclebin
name type value
------------------------------------ ----------- -----
recyclebin string on
1、 session會話級别
打開:alter session set recyclebin = on;
關閉:alter session set recyclebin = off;
sql> alter session set recyclebin = on;
會話已更改。
sql> alter session set recyclebin = off;
2、 system系統級别
10g環境:
打開:alter system set recyclebin = on;
關閉:alter system set recyclebin = off;
sql> alter system set recyclebin = on;
系統已更改。
sql> alter system set recyclebin = off;
11g環境:
打開:alter system set recyclebin = on deferred;
關閉:alter system set recyclebin = off deferred;
sql> alter system set recyclebin = on;
alter system set recyclebin = on
*
第 1 行出現錯誤:
ora-02096: 此選項的指定初始化參數不可修改
sql> alter system set recyclebin = off;
alter system set recyclebin = off
*
sql> alter system set recyclebin = on deferred;
sql> alter system set recyclebin = off deferred;
三、 recycle bin都有哪些視圖
1、dba_recyclebin:放置了所有使用者drop掉的對象,不含system表空間。
sql> create table t(a number) tablespace system;
sql> insert into t values(1);
sql> commit;
sql> select tablespace_name from user_tables where table_name = 't';
sql> drop table t;
表已删除。
sql> select * from dba_recyclebin;
未標明行
2、user_recyclebin:放置了目前使用者drop掉的對象。
兩個視圖具有相同的結構:
sql> desc user_recyclebin;
名稱 是否為空? 類型
----------------------------------------------------- -------- --------------
object_name not null varchar2(30)
original_name varchar2(32)
operation varchar2(9)
type varchar2(25)
ts_name varchar2(30)
createtime varchar2(19)
droptime varchar2(19)
dropscn number
partition_name varchar2(32)
can_undrop varchar2(3)
can_purge varchar2(3)
related not null number
base_object not null number
purge_object not null number
space number
四、 使用recycle bin
1、drop操作産生的recycle bin資訊:
sql> select * from user_recyclebin;
未標明行
sql> create table t (n number) tablespace users;
表已建立。
sql> insert into t values (1);
已建立 1 行。
sql> commit;
送出完成。
sql> select * from t;
n
----------
1
sql> drop table t;
表已删除。
sql> set linesize 200;
sql> select object_name,original_name,operation,createtime,droptime,dropscn from user_recyclebin;
object_name original_name operation createtime droptime dropscn
------------------------------ -------------------------------- --------- ------------------- ------------------- ----------
bin$e67hnmq4sogioyi0vl3bvq==$0 t drop 2013-07-04:13:48:38 2013-07-04:13:49:11
2217235
再結合tab視圖(包含目前使用者所有的表、視圖等一些對象):
sql> select * from tab;
tname tabtype clusterid
------------------------------ ------- ----------
bin$e67hnmq4sogioyi0vl3bvq==$0 table
gt1 table
gt2 table
t1 table
在recyclebin打開的情況下,如果使用者執行了drop操作,這被drop掉的對象,并不會直接從資料庫清除,隻會改個名字還是儲存在原來的資料塊上,但是應該這個資料塊會被打上已被drop的辨別。
上面的試驗,在使用者drop掉表t以後,表t在tab視圖中不見了,但是在tab視圖中多了一個表名為bin$e67hnmq4sogioyi0vl3bvq==$0的對象;再從user_recyclebin這個視圖可以檢視到,該視圖存在一個對象名為bin$e67hnmq4sogioyi0vl3bvq==$0的表,且原表名為t。
bin$e67hnmq4sogioyi0vl3bvq==$0,它的命名規範為bin$unique_id$version 其中bin代表recyclebin,
unique_id是資料庫中該對象的唯一标志,24個字元長度,version表示該對象的版本号
2、還原資源回收筒内容
flashback table [已删除table名|”recyclebin中的名字”]
to before drop;
例如:flashback table t to before drop;
flashback table ”bin$e67hnmq4sogioyi0vl3bvq==$0” to before drop;
注意問題:如果使用者drop掉幾個相同表名的對象,則使用flashback table t to before drop,隻能恢複最後被drop掉的對象;若想明确恢複某個對象,則使用flashback
table ”bin$e67hnmq4sogioyi0vl3bvq==$0” to before drop。
sql> create table t (a varchar2(2)) tablespace users;
sql> insert into t values('a');
sql> select object_name,original_name,operation,droptime,dropscn from user_recyclebin;
object_name original_name operation droptime dropscn
------------------------------ -------------------------------- --------- ------------------- ----------
bin$so7fbmzfrni2jzvixkb8fq==$0 t drop 2013-07-04:17:20:44 2225949
bin$e67hnmq4sogioyi0vl3bvq==$0 t drop 2013-07-04:13:49:11 2217235
sql> desc "bin$so7fbmzfrni2jzvixkb8fq==$0"
名稱
a
sql> desc "bin$e67hnmq4sogioyi0vl3bvq==$0"
n
sql> flashback table t to before drop;-----恢複的對象是最後一次被删除的。
閃回完成。
sql> desc t;
-------相同對象名的,在恢複了一個之後,再恢複其他的,需要rename對象名。
sql> flashback table t to before drop;
flashback table t to before drop
*
ora-38312: 原始名稱已被現有對象使用
sql> flashback table t to before drop rename to t2;
sql> desc t2
名稱 是否為空? 類型
----------------------------- -------- --------------------
n number
3、清空資源回收筒對象
sql> purge recyclebin;
資源回收筒已清空。
sql> purge user_recyclebin;
清空某個特定對象:
purge table t;
若recyclebin中有多個對象名為t,則最先被清除的是最早被drop掉的對象。
可以通過下面指令明确清除某個對象:
purge table “bin$so7fbmzfrni2jzvixkb8fq==$0”;
4、drop操作後不再recyclebin中産生資訊
drop table tablename purge;
或者改變系統或會話的recyclebin狀态。
alter system set recyclebin = off;
alter session set recyclebin = off;