介绍

假如你在维护时不小心删除了一张表,这张表对于业务又很重要。这时,你会咋办呢?辞职?跑路?还是辞职跑路?如果我告诉你,不使用RMAN,也能恢复被删除的表,你信吗?不信?那今天就让你相信一下。

不知从什么时候开始,Oracle也开始有了回收站了。看到回收站的第一眼,你是不是就想到了Windows系统的回收站,windows系统在删除文件时,会先将文件移动到回收站,然后再由你确定是删除还是还原。Oracle的回收站跟Windows的有点像,只不过Oracle的回收站是用来存储被删除的表的。Oracle回收站的功能简单来说,就是在drop表时,不会真正的把表删除,而是将表重命名一个唯一名称,只有当表的拥有者使用的表空间不足时,才会真正的清理它,释放表空间。既然只是重命名了表,那么我们肯定也能再改回来。Oracle将这种从回收站的表找回来的这种方法,叫做Flashback Drop(闪回删除或闪回回收站)。

与Flashback Drop有关的参数是RECYCLEBIN。

RECYCLEBIN参数是指定数据库是否开启回收站,它由两个选项,分别是:ON和OFF。当设置为ON时,数据库启动回收站功能,Drop表操作实际上是重命名,待表空间不足时才会真正清理;设置为OFF时,关闭回收站功能,Drop表操作就是直接删除表并释放空间。在11G中,RECYCLEBIN的默认值是ON。对于system级别,它是静态参数,需要重启数据库生效;对于session级别,它是动态参数,在本会话内的drop操作都不会放入回收站。

需要注意的是,使用flashback drop特性闪回表时,表的依赖对象(如索引)不会恢复原来的名称。因此,建议在闪回表时,首先通过dba_recyclebin记下表依赖的相关名称,待闪回表后,将索引等依赖对象重命名。

语法

FLASHBACK TABLE
   [ schema. ] table
     [, [ schema. ] table ]...
   TO { BEFORE DROP [ RENAME TO table ] } ;

说明:

  • schema 表的拥有者
  • table 表名

先决条件

  • 初始化参数或会话的参数recyclebin必须为ON,也就是数据库的回收站功能必须被启用。
  • drop表的语句不能再purge,purge会忽略回收站,直接把表删除,释放表空间。

案例

闪回表

首先查询回收站中的表

select * from dba_recyclebin;

回收站中确定有被删除的表后,再执行闪回。

flashback table TES23T to before drop;