关于Recycle Bin是什么以及实验

关于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

                                *

第 行出现错误:

ORA-02096此选项的指定初始化参数不可修改

SQL> alter  system set recyclebin = off;

alter  system set recyclebin = off

                                 *

第 行出现错误:

ORA-02096此选项的指定初始化参数不可修改

SQL> alter  system set recyclebin = on deferred;

系统已更改。

SQL> alter  system set recyclebin = off deferred;

系统已更改。


三、 Recycle Bin都有哪些视图

   1dba_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;

       未选定行


   2user_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);

已创建 行。

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以后,表ttab视图中不见了,但是在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> 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

*

第 行出现错误:

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;


上一篇:Android Studio 通过 ListVIew 学习 Adapter


下一篇:iOS 开发,工程中混合使用 ARC 和非ARC