Oracle闪回技术之二 Oracle 11g 利用Oracle RecycleBin (回收站)闪回删除功能

来源:互联网 发布:饮水机 知乎 编辑:程序博客网 时间:2024/05/07 07:08

回收站介绍:实现闪回删除功能,需要使用oracle回收站。回收站是所有被删除对象及其相依对象的逻辑存储容器,例如当一个表被drop时,该表及其相依对象并不会马上被数据库彻底删除,而是被保存到回收站中。

回收站将用户执行的drop操作记录在一个系统表中,也就是将被删除的对象写到一个数据字典中。如果确定不再需要该对戏那个,可以使用purge命令对回收站进行清空。被删除的对象的名称可能相同。为了确保添加到回收站中的对象的名称都是唯一的,系统会对这些保存到回收站中的对象进行重命名,命名格式如下:

BIN$globalUID$version

其中,BIN表示RecycleBIN,globalUID是一个全局唯一的、24个字符长的标识对象,该标识与原对象名没有任何关系,$version表示数据库分配的版本号。

接下来演示一个示例:

首先创建一个表tb_temptest,并插入两条数据:

SQL> create table tb_temptest(id number)
  2  /

表已创建。

SQL> insert into tb_temptest select 1 from dual union select 2 from dual

已创建2行。

SQL> commit;

提交完成。

查看刚插入的数据:

SQL> select * from tb_temptest;

        ID
----------
         1
         2

SQL>

执行drop删除表:

SQL> drop table tb_temptest;

表已删除。

查看回收站是否保存了刚才删除的表

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------

TB_TEMPTEST      BIN$/xHQTJWwTr20WgwHd65BUQ==$0 TABLE        2013-01-26:20:50:32

从上面可以看出刚才删除的表被存储在回收站中了(注意sys用户和system用户除外,只有普通用户操作才能被保存到回收站中)

执行闪回删除,相应的数据也恢复回来了:

SQL> flashback table tb_temptest to before drop;

闪回完成。

SQL> show recyclebin;
SQL> select * from tb_temptest;

        ID
----------
         1
         2

SQL>

如果在执行闪回操作时数据库中已经重建了相同的表名,这时需要对闪回的表进行重命名:

SQL> flashback table tb_temptest to before drop rename to newtablename;

闪回时也可以使用RECYCLEBIN NAME进行恢复,(但要加双引号)

我们再次drop掉表tb_temptest,并用RECYCLEBIN NAME进行闪回:

SQL> drop table tb_temptest;

表已删除。

SQL> show recyclebin;
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------

TB_TEMPTEST      BIN$EjDM+LpCQ22xKBt22KnjXQ==$0 TABLE        2013-01-26:21:08:12

SQL> flashback table "BIN$EjDM+LpCQ22xKBt22KnjXQ==$0" to before drop;

闪回完成。

SQL> show recyclebin;
SQL> select * from tb_temptest;

        ID
----------
         1
         2

SQL>