【对象管理】recyclebin

       recyclebin,也称为回收站,用于存放DROP后的对象。其用于非SYSTEM表空间、段空间管理为AUTO的环境中。

一、recyclebin里面的对象。

       当删除了表空间、用户、聚集、TYPE的时候,其中的对象不会保留在回收站中,也就是说,在这些对象下的表不能通过flashback table to before drop来进行恢复。另外删除表的时候,会同时删除表的索引、触发器等对象;

----删除了表空间后,其对象不会在回收站里面
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 to before drop.不过,闪回之后,依附在表上一同闪回的其他对象,如索引、触发器等的名称用的的系统生成名称,并不能恢复到原来的名称,需要手动恢复。

-----承接上面的代码
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之后,就不能再闪回。

purge table test02;---清除表,会连带清除其相关的对象;
purge index "BIN$hjRjx4tdT7qw4Ytm0ssmxg==$1";---清除索引;
purge tablespace users;----清除回收站中users表空间的对象;
purge tablespace users user sh;----清除回收站中用户为SH,表空间为users的对象;
purge recyclebin;---清空回收站;

你可能感兴趣的:(Oracle,Management)