介绍
假如你在维护时不小心删除了一张表,这张表对于业务又很重要。这时,你会咋办呢?辞职?跑路?还是辞职跑路?如果我告诉你,不使用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;