14.6 闪回删表(Flashback Drop)

14.6  闪回删表(Flashback Drop)(1)

闪回删表指的是撤销"DROP TABLE"的效果,也就是说,如果发现问题比较及时,可将一张被删除的表"抢救"回来,命令主要结构为"FLASHBACK TABLE … TO BEFORE DROP"。

比如,创建一张带数据的新表EMP:

 
 
  1. SQL> create table emp tablespace users as select * from hr.employees;  
  2.  
  3. Table created.  

删除EMP:
 
 
  1. SQL> drop table emp;  
  2.  
  3. Table dropped.  

救回EMP:
 
 
  1. SQL> flashback table emp to before drop;  
  2.  
  3. Flashback complete.  
  4.  
  5. SQL> select count(*) from emp;  
  6.  
  7.   COUNT(*)  
  8. ----------  
  9.        107  

该功能的工作原理是:当"drop table"命令执行时,表及其索引并没有被真正删除,其所占空间(称为段)只是分配给了另一种数据库对象:回收站对象,并且这种所谓的分配使数据和数据块没有发生任何移动,还是待在原来的数据文件及表空间中。

回收站对象的信息可以通过查询dba_recyclebin视图(所有回收站对象)获得,普通用户可以使用快捷方式"show recyclebin"命令查看自己的回收站:

 
 
  1. SQL> show recyclebin  
  2.  
  3. ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME  
  4. --------------- ----------------------------- ------------ -------------------  
  5. EMP              BIN$r4C+sJfzPq7gQAsLDAsoBQ==$0 TABLE        2011-10-17:22:51:41  

回收站对象本身也可以被查询:
 
 
  1. SQL> select count(*) from "BIN$r4C+sJfzPq7gQAsLDAsoBQ==$0";  
  2.  
  3.   COUNT(*)  
  4. ----------  
  5.        107  

将回收站对象取出,并命名一个新名字:如果表名重复,在闪回时遵循后入先出原则,留意"show recyclebin"命令显示的"DROP TIME"字段:
 
 
  1. SQL> flashback table emp to before drop rename to empold;  
  2.  
  3. Flashback complete.  

如果表名重复,在闪回时遵循后入先出原则,留意"show recyclebin"命令显示的"DROP TIME"字段:
 
 
  1. SQL> show recyclebin  
  2.  
  3. ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME  
  4. ---------------- ----------------------------- ----------- -------------------  
  5. EMP              BIN$r4D3SgQcjj7gQAsLDAsxdw==$0 TABLE        2011-10-17:23:07:50  
  6. EMP              BIN$r4D3SgQXjj7gQAsLDAsxdw==$0 TABLE        2011-10-17:23:07:31  

或者在闪回时指明被恢复的回收站对象:
 
 
  1. SQL> flashback table "BIN$r4D3SgQXjj7gQAsLDAsxdw==$0" to before drop;  
  2.  
  3. Flashback complete.  

诚然,回收站对象毕竟是一种弱存在,Oracle没有义务永远保留被删除的表的数据,表空间在自动增长的压力下会按照先入先出的规则将回收站对象的区(数据块的集合)分配给需要空间的段,在将回收站对象耗尽之前数据文件是不会自动增长的,反之,若数据文件自动增长了,那么在其内的所有回收站对象已经全部失效了。

以下查询可以确认有哪些回收站对象因为原本属于自身的区(数据块的集合)被别的段占用已经不能回到被DROP之前了:

 
 
  1. SQL> select owner,object_name,original_name   
  2.    2 from dba_recyclebin where can_undrop='NO';  
  3.  
  4. no rows selected  

14.6  闪回删表(Flashback Drop)(2)

若无意使用回收站服务,可以采用purge命令或子句清空或跳过回收站。比如,删除EMP表并且不产生回收站对象:

 
 
  1. SQL> drop table emp purge;  
  2.  
  3. Table dropped.  

删除一个特定的回收站对象:
 
 
  1. SQL> purge table "BIN$r4D3SgQmjj7gQAsLDAsxdw==$0";  
  2.  
  3. Table purged.  

删除当前用户的回收站中的所有对象:
 
 
  1. SQL> purge user_recyclebin;  
  2.  
  3. Recyclebin purged.  

删除USERS表空间中的所有的回收站对象:
 
 
  1. SQL> purge tablespace users;  
  2.  
  3. Tablespace purged.  

删除数据库中所有的回收站中的所有对象:
 
 
  1. SQL> purge dba_recyclebin;  
  2.  
  3. DBA Recyclebin purged.  

若要完全禁用回收站功能,可将静态参数recyclebin改为"off"后重启实例:
 
 
  1. SQL> alter system set recyclebin='off' scope=spfile;  
  2.  
  3. System altered.  
  4.  
  5. SQL> startup force;  
  6. ORACLE instance started.  
  7.  
  8. Total System Global Area  972898304 bytes  
  9. Fixed Size                  2219272 bytes  
  10. Variable Size             608174840 bytes  
  11. Database Buffers          356515840 bytes  
  12. Redo Buffers                5988352 bytes  
  13. Database mounted.  
  14. Database opened.  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值