在oracle中drop一张表,并未真正的删除,只是把数据自定中把该表重命名了(sys表空间除外),想要恢复表数据不必通过数据库还原来实现,此时,可以在Oracle回收站中找回该表的数据,首先,要确保数据库的回收机制是否开启,VALUE= ON表示开启了回收站机制。OFF则表示回收站机制关闭:
命令窗口:
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string ON
或
Sql窗口:
select name,value from v$parameter where name = 'recyclebin';
也可以通过sql语句进行开启或关闭:
会话级别开启/关闭
alter session set recyclebin = off/on
系统级别开启/关闭
alter system set recyclebin = off/on scope = spfile;--(需要重启数据库)
假如新建一个名为test001的表,里面字段包含了name,sex,age三个字段,
create table test001(name varchar2(10),sex varchar2(3),age varchar(3));
然后新增一条数据进去:
insert into test001 values('张三','男','20');
然后drop掉这张表:
drop table test001;
此时在查询这张表就会提示表或视图不存在的错误,
这是drop的test001表已经进入到回收站里了,可以通过以下sql语句查看回收站(recyclebin)
--查看数据库当前用户的回收站对象
select * from recyclebin;
select * from user_recyclebin;
--需要相关权限才能查询
select * from dba_recyclebin;
可以查看到查出的数据:
然后就是还原被删除的test001表,通过flashback drop实现:
flashback table test001 to before drop;
还原之后再通过查询:
select * from test001
这张表已经还原了,还可以还原成新的表名:
flashback table test001 to before drop rename to test002;
Flashback drop 只能用于非系统表空间和本地管理的表空间,在系统表空间中,表drop后就真的删除了,而不是存放在回收站中。
清空回收站的数据:
purge table tablename;--清空回收站某张表
purge recyclebin;--清空回收站所有数据
purge recyclebin tablename user scott;--清空回收站数据,但保留用户的数据