闪回恢复误删除对象
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>
for linux and python