概述:
工作过程中,会出现误删表的情况,这时,可以通过flashback的方式恢复被删除的表。
通过
flashback table table_name to before drop;
语句可以实现恢复表的功能。
如果想要完全删除,在最后增加purge即可。
drop table CELL_SIGN_PD_LIST_ZQ purge;
接下来,我们通过实验的方式进行验证理解。
实验
有如下表:CELL_SIGN_PD_LIST_ZQ
我们查看下该表占用的表空间和表的大小。
--查询表空间的剩余空间
select
t.TABLESPACE_NAME
,SUM(t.BYTES/1024/1024) sz
from dba_free_space t
group by t.TABLESPACE_NAME;
--查询表占用空间
select
t.segment_name
,t.BYTES/1024/1024 sz
from user_segments t
where t.segment_type = 'TABLE'
order by sz desc
执行删表操作:
drop table CELL_SIGN_PD_LIST_ZQ;
再次查询表,可以确定表确实已删除:
select * form CELL_SIGN_PD_LIST_ZQ;
再次查询便空间大小,可以看到已经释放了空间。
通过flashback恢复表
flashback table CELL_SIGN_PD_LIST_ZQ to before drop;
再次查询表,可以看到,表已经恢复,并且表空间相应的变小了。
select * form CELL_SIGN_PD_LIST_ZQ;
下面测试下完全删除表:purge
有如下一张测试表:test_purge
彻底删除表:
drop table test_purge purge;
尝试恢复表:
flashback table test_purge to before drop
发现无法恢复,并报错:对象不再回收站内。
事实上:
drop table 语句中,除非指定了purge字句,否则drop table并不会立即删除表,Oracle只是简单的重命名此表并将其存储在回收站中。