闪回恢复误删除对象

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> 






posted @ 2014-07-23 16:37  KEL  阅读(254)  评论(0编辑  收藏  举报