recyclebin,也称为回收站,用于存放DROP后的对象。其用于非SYSTEM表空间、段空间管理为AUTO的环境中。
一、recyclebin里面的对象。
当删除了表空间、用户、聚集、TYPE的时候,其中的对象不会保留在回收站中,也就是说,在这些对象下的表不能通过flashback table
----删除了表空间后,其对象不会在回收站里面
SQL> create tablespace test04
2 logging
3 datafile 'D:\APP\ASUS\ORADATA\TEST\TEST04.DBF' SIZE 10M AUTOEXTEND ON NEXT 2M MAXSIZE 16M
4 EXTENT MANAGEMENT LOCAL;
表空间已创建。
SQL> create table t2(id int);
表已创建。
SQL> begin
2 for i in 1..10 loop
3 insert into t2
4 select i from dual;
5 end loop;
6 end;
7 /
PL/SQL 过程已成功完成。
SQL> drop tablespace test04 including contents and datafiles;
表空间已删除。
SQL> show recyclebin;
SQL> select * from user_recyclebin;
未选定行
-----删除了用户,用户下的对象不会在回收站里面;
SQL> create user t1 identified by 123;
用户已创建。
SQL> grant connect ,resource to t1;
授权成功。
SQL> conn t1/123@test;
已连接。
SQL> create table t(id int);
表已创建。
SQL> begin
2 for i in 1..10 loop
3 insert into t
4 select i from dual;
5 end loop;
6 end ;
7 /
PL/SQL 过程已成功完成。
SQL> conn sh/123456@test;
已连接。
SQL> drop user t1 cascade;
用户已删除。
SQL> show recyclebin;
SQL> select * from user_recyclebin;
未选定行
------删除聚集后,聚集中的对象不在recyclebin中;
SQL> create cluster clus
2 (department_id number(6))
3 size 512
4 storage(initial 100k next 20k);
簇已创建。
SQL> create table dept1
2 cluster clus(department_id)
3 as
4 select * from employees where department_id =10;
SQL> drop cluster clus;
簇已删除。
SQL> show recyclebin;
SQL> select * from user_recyclebin;
未选定行
----删除TYPE后,其对象也都不会保存在回收站中
SQL> create or replace type strings
2 as varray(3) of varchar2(30 char);
3 /
类型已创建。
SQL> drop type strings;
类型已删除。
SQL> show recyclebin;
SQL> select * from user_recyclebin;
未选定行
SQL> create table test01(
2 id int primary key,
3 num int check (num>0)
4 );
表已创建。
SQL> begin
2 for i in 1..1000 loop
3 insert into test01
4 select i,i+10 from dual;
5 end loop;
6 end;
7 /
PL/SQL 过程已成功完成。
SQL> create index ind on test01(num);
索引已创建。
SQL> create or replace trigger tri after update on test01
2 for each row
3 begin
4 null;
5 end;
6 /
触发器已创建
SQL> drop table test01;
表已删除。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST01 BIN$uu/vqP7BQLqaWFAFGdCVow==$0 TABLE 2013-08-04:15:21:29
SQL> col type format A10;
SQL> set linesize 200 pagesize 100;
SQL> select object_name,original_name,operation,type,dropscn,can_undrop,can_purge,space from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPSCN CAN CAN SPACE
------------------------------ -------------------------------- --------- ---------- ---------- --- --- ----------
BIN$9Lynk62fRPKvUwnDzxtfFg==$0 IND DROP INDEX 2300167 NO YES 8
BIN$x8drOFCARgi6YbOCfQobXg==$0 SYS_C0011485 DROP INDEX 2300170 NO YES 8
BIN$3aZcEg/ORf+HaLqD1M4ZBw==$0 TRI DROP TRIGGER 2300175 NO NO
BIN$uu/vqP7BQLqaWFAFGdCVow==$0 TEST01 DROP TABLE 2300195 YES YES 8
-----从上面的结果来看,show recyclebin只是显示删除的表,其他的都不显示了啊!
二、恢复recyclebin中的表对象
恢复表的使用使用了闪回删除,flashback table
-----承接上面的代码
SQL> flashback table test01 to before drop;---闪回表
闪回完成。
/*然后我们做了一个巧妙的实验:
*我们在删除表,我们发现自从上次闪回之后,索引、触发器并没有恢复到原来的名称
*因为,它们的original_name这一列显示的原名都是系统生成的名称。
*/
SQL> drop table test01;
表已删除。
SQL> select object_name,original_name,operation,type,dropscn,can_undrop,can_purge,space from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPSCN CAN CAN SPACE
------------------------------ -------------------------------- --------- ---------- ---------- --- --- ----------
BIN$efHOuQ55QeGOleRnjds9Ng==$1 BIN$9Lynk62fRPKvUwnDzxtfFg==$0 DROP INDEX 2300988 NO YES 8
BIN$eDiaN+QsSjuNLwHyP4V5OA==$1 BIN$x8drOFCARgi6YbOCfQobXg==$0 DROP INDEX 2300993 NO YES 8
BIN$icpAUck+SZWm5x8xf7NF5w==$1 BIN$3aZcEg/ORf+HaLqD1M4ZBw==$0 DROP TRIGGER 2300997 NO NO
BIN$rnTFheVJRZm70JzR3kjpUw==$0 TEST01 DROP TABLE 2301024 YES YES 8
SQL> flashback table test01 to before drop;
闪回完成。
----为此,下面需要的做的事,就是修改这些索引,触发器的名称;
SQL> alter index "BIN$efHOuQ55QeGOleRnjds9Ng==$1" rename to ind;
索引已更改。
SQL> alter index "BIN$eDiaN+QsSjuNLwHyP4V5OA==$1" rename to pk1;
索引已更改。
SQL> alter trigger "BIN$icpAUck+SZWm5x8xf7NF5w==$1" rename to tri;
触发器已更改
不过,需要注意的是,如果闪回的时候,如果已经存在了同样名称的表,就需要改名才能闪回。否则,会报错!
-----恢复的时候改名
SQL> drop table test01;
表已删除。
SQL> create table test01(
2 id int primary key,
3 num int check (num>0)
4 );
表已创建。
SQL> flashback table test01 to before drop;
flashback table test01 to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用
SQL> flashback table test01 to before drop rename to test02;
闪回完成。
SQL> select count(*) from test02;
COUNT(*)
----------
1000
另外,闪回的时候,如果recyclebin里面有多个同名的,闪回的是最近删除的那个。若要指定闪回,则需要用系统名称来闪回。
SQL> drop table test02;
表已删除。
SQL> create table test02(
2 id int primary key,
3 num int check (num>0)
4 );
表已创建。
SQL> drop table test02;
表已删除。
/*可以看到,此时回收站中有两个TEST02,其中一个的SPACE为0,即后来删除的那个,一个为8,即删除时间最久的那个
*
*/
SQL> select object_name,original_name,operation,type,dropscn,can_undrop,can_purge,space from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPSCN CAN CAN SPACE
------------------------------ -------------------------------- --------- ---------- ---------- --- --- ----------
BIN$C+VtOGheRCKtqJ38u7Gecw==$0 SYS_C0011498 DROP INDEX 2304927 NO YES 0
BIN$KSAn0pw9TDGm4F2SS1O6oQ==$0 TEST02 DROP TABLE 2304931 YES YES 0
BIN$n6jhV8QGRtuGvqlTKUQ4Sg==$1 BIN$FFAIZUJTRX2XgeR5NOuCuQ==$0 DROP INDEX 2304843 NO YES 8
BIN$C82nFTU9SJC+HlFF5ArFBQ==$1 BIN$t5F3X1LLRDGzqZHptflEGQ==$0 DROP INDEX 2304846 NO YES 8
BIN$EwLLAKdvRyywGTsxZ8fsxA==$1 BIN$/vxhZo+iR5m2WPfOav964w==$0 DROP TRIGGER 2304851 NO NO
BIN$Hem9VHn7TXywU3wRy6Eq8g==$0 TEST02 DROP TABLE 2304869 YES YES 8
已选择6行。
SQL> flashback table test02 to before drop;
闪回完成。
---从闪回的结果来看,闪回的是SPACE为0的那个,也就是最近删除的那个;
SQL> select object_name,original_name,operation,type,dropscn,can_undrop,can_purge,space from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPSCN CAN CAN SPACE
------------------------------ -------------------------------- --------- ---------- ---------- --- --- ----------
BIN$n6jhV8QGRtuGvqlTKUQ4Sg==$1 BIN$FFAIZUJTRX2XgeR5NOuCuQ==$0 DROP INDEX 2304843 NO YES 8
BIN$C82nFTU9SJC+HlFF5ArFBQ==$1 BIN$t5F3X1LLRDGzqZHptflEGQ==$0 DROP INDEX 2304846 NO YES 8
BIN$EwLLAKdvRyywGTsxZ8fsxA==$1 BIN$/vxhZo+iR5m2WPfOav964w==$0 DROP TRIGGER 2304851 NO NO
BIN$Hem9VHn7TXywU3wRy6Eq8g==$0 TEST02 DROP TABLE 2304869 YES YES 8
SQL> drop table test02;
表已删除。
SQL> select object_name,original_name,operation,type,dropscn,can_undrop,can_purge,space from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPSCN CAN CAN SPACE
------------------------------ -------------------------------- --------- ---------- ---------- --- --- ----------
BIN$n6jhV8QGRtuGvqlTKUQ4Sg==$1 BIN$FFAIZUJTRX2XgeR5NOuCuQ==$0 DROP INDEX 2304843 NO YES 8
BIN$C82nFTU9SJC+HlFF5ArFBQ==$1 BIN$t5F3X1LLRDGzqZHptflEGQ==$0 DROP INDEX 2304846 NO YES 8
BIN$EwLLAKdvRyywGTsxZ8fsxA==$1 BIN$/vxhZo+iR5m2WPfOav964w==$0 DROP TRIGGER 2304851 NO NO
BIN$Hem9VHn7TXywU3wRy6Eq8g==$0 TEST02 DROP TABLE 2304869 YES YES 8
BIN$hjRjx4tdT7qw4Ytm0ssmxg==$1 BIN$C+VtOGheRCKtqJ38u7Gecw==$0 DROP INDEX 2305153 NO YES 0
BIN$7tP8UkvjSvOa+3dh4kp0sQ==$0 TEST02 DROP TABLE 2305156 YES YES 0
已选择6行。
----指定系统名称恢复;
SQL> flashback table "BIN$Hem9VHn7TXywU3wRy6Eq8g==$0" to before drop;
闪回完成。
SQL> select object_name,original_name,operation,type,dropscn,can_undrop,can_purge,space from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPSCN CAN CAN SPACE
------------------------------ -------------------------------- --------- ---------- ---------- --- --- ----------
BIN$hjRjx4tdT7qw4Ytm0ssmxg==$1 BIN$C+VtOGheRCKtqJ38u7Gecw==$0 DROP INDEX 2305153 NO YES 0
BIN$7tP8UkvjSvOa+3dh4kp0sQ==$0 TEST02 DROP TABLE 2305156 YES YES 0
如果purge之后,就不能再闪回。
purge table test02;---清除表,会连带清除其相关的对象;
purge index "BIN$hjRjx4tdT7qw4Ytm0ssmxg==$1";---清除索引;
purge tablespace users;----清除回收站中users表空间的对象;
purge tablespace users user sh;----清除回收站中用户为SH,表空间为users的对象;
purge recyclebin;---清空回收站;