flashback drop用于恢复用户误删除的对象,包括表、索引等,依赖于tablespace recycle bin ,表空间回收站
初始化参数recyclebin参数用于控制是否启用recyclebin功能,缺省是ON
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ -------- ------------------------------
recyclebin string on
在启用这个功能的时候,是不能恢复sys用户的表的。
SQL> conn / as sysdba
Connected.
SQL> create table t(id int);
Table created.
SQL> drop table t;
Table dropped.
SQL> show recyclebin;
SQL> conn kel/kel
Connected.
SQL> create table p (id int);
Table created.
SQL> drop table p;
Table dropped.
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
P BIN$/ti6DA4axIDgQKjAbgFLmA==$0 TABLE 2014-07-23:00:59:59
T BIN$/sAFsZ9FnTPgQKjAbgEXcA==$0 TABLE 2014-07-21:19:31:34
可以使用show recyclebin命令来查看recycle bin中的对象列表:
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
P BIN$/ti6DA4axIDgQKjAbgFLmA==$0 TABLE 2014-07-23:00:59:59
T BIN$/sAFsZ9FnTPgQKjAbgEXcA==$0 TABLE 2014-07-21:19:31:34
也可以通过视图来进行查看recycle bin中的对象列表:
SQL> select object_name as recycle_name,original_name from recyclebin;
RECYCLE_NAME ORIGINAL_NAME
------------------------------ ------------------------------
BIN$/sAFsZ9FnTPgQKjAbgEXcA==$0 T
BIN$/ti6DA4axIDgQKjAbgFLmA==$0 P
可以像查看普通表一样,来查看recycle bin 中对象的内容:
SQL> select count(*) from "BIN$/ti6DA4axIDgQKjAbgFLmA==$0";
COUNT(*)
----------
0
要使用flashback drop功能恢复误删除的表,需要做以下几点:
1、 确认已删除的表在recycle bin中
2、使用flashback table来进行恢复
SQL> drop table kel;
Table dropped.
SQL> show recyclebin --查看删除表是否在recycle bin中
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
KEL BIN$/ti6DA4bxIDgQKjAbgFLmA==$0 TABLE 2014-07-23:01:07:09
P BIN$/ti6DA4axIDgQKjAbgFLmA==$0 TABLE 2014-07-23:00:59:59
T BIN$/sAFsZ9FnTPgQKjAbgEXcA==$0 TABLE 2014-07-21:19:31:34
SQL> flashback table kel to before drop ; --利用flashback table来进行闪回
Flashback complete.
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
P BIN$/ti6DA4axIDgQKjAbgFLmA==$0 TABLE 2014-07-23:00:59:59
T BIN$/sAFsZ9FnTPgQKjAbgEXcA==$0 TABLE 2014-07-21:19:31:34
SQL> select count(*) from kel; --检验
COUNT(*)
----------
1
如果同名的表在recycle bin中存在,可以恢复到需要的那个表:
SQL> show recyclebin; --查看回收站中内容
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
KEL BIN$/ti6DA4exIDgQKjAbgFLmA==$0 TABLE 2014-07-23:01:13:05
KEL BIN$/ti6DA4cxIDgQKjAbgFLmA==$0 TABLE 2014-07-23:01:09:41
P BIN$/ti6DA4axIDgQKjAbgFLmA==$0 TABLE 2014-07-23:00:59:59
T BIN$/sAFsZ9FnTPgQKjAbgEXcA==$0 TABLE 2014-07-21:19:31:34
SQL> select count(*) from "BIN$/ti6DA4exIDgQKjAbgFLmA==$0";--查看哪个是想恢复的表
COUNT(*)
----------
2
SQL> select count(*) from "BIN$/ti6DA4cxIDgQKjAbgFLmA==$0";--查看哪个是想恢复的表
COUNT(*)
----------
1
SQL> flashback table "BIN$/ti6DA4exIDgQKjAbgFLmA==$0" to before drop;--恢复表
Flashback complete.
SQL> select count(*) from kel;
COUNT(*)
----------
2
SQL> show recyclebin; --恢复完成之后,recycle bin中的内容也就消失了
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
KEL BIN$/ti6DA4cxIDgQKjAbgFLmA==$0 TABLE 2014-07-23:01:09:41
P BIN$/ti6DA4axIDgQKjAbgFLmA==$0 TABLE 2014-07-23:00:59:59
T BIN$/sAFsZ9FnTPgQKjAbgEXcA==$0 TABLE 2014-07-21:19:31:34
在恢复的同时,也可以对表进行重命名:
SQL> show recyclebin; --查看回收站的对象
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
KEL BIN$/ti6DA4cxIDgQKjAbgFLmA==$0 TABLE 2014-07-23:01:09:41
P BIN$/ti6DA4axIDgQKjAbgFLmA==$0 TABLE 2014-07-23:00:59:59
T BIN$/sAFsZ9FnTPgQKjAbgEXcA==$0 TABLE 2014-07-21:19:31:34
SQL> flashback table kel to before drop rename to kel1;--恢复表并且重命名为kel1
Flashback complete.
在recycle bin中,oracle可以区分不同用户的同名的表。
recycle bin的维护:
1、 只能用于非系统表空间和本地管理的表空间
2、如果对象创建在本地管理的表空间,而关联对象,比如索引创建在字典管理的表空间上,则恢复时字段管理的表空间关联对象不能被恢复
3、对象是否能恢复成功,取决于对象空间是否被覆盖重用
4、 不能对recycle bin中的内容进行DML和DDL的操作,只能做查询操作
5、 对象的参考约束不能被恢复,也就是外键约束需要重建
手动清除recycle bin的空间:
清除表空间的recycle bin:
SQL> purge tablespace kel ;--kel为表空间名称
Tablespace purged.
清除表空间的指定用户的recycle bin:
SQL> purge tablespace kel user kel;--第一个kel是表空间名称,第二个kel是用户名称
Tablespace purged.
删除当前用户recycle bin中的对象:
SQL> purge recyclebin;
Recyclebin purged.
删除所有用户的recycle bin 对象--需要sysdba权限:
SQL> purge dba_recyclebin;
purge dba_recyclebin
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> conn / as sysdba
Connected.
SQL> purge dba_recyclebin;
DBA Recyclebin purged.
永久删除表,也就是不放在recycle bin中,不能恢复:
SQL> conn kel/kel
Connected.
SQL> show recyclebin;
SQL> drop table kel1 purge;
Table dropped.
SQL> show recyclebin;--表被永久删除
SQL>