关于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.
在Oracle 10g数据库中,引入了一个回收站(Recycle 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
*
第 1 行出现错误:
ORA-02096: 此选项的指定初始化参数不可修改
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');
已创建 1 行。
SQL> commit;
提交完成。
SQL> drop table t;
表已删除。
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;
名称
A
-------相同对象名的,在恢复了一个之后,再恢复其他的,需要rename对象名。
SQL> flashback table t to before drop;
flashback table t to before drop
*
第 1 行出现错误:
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;