分类:
2012-03-04 21:22:06
原文地址:Oracle Flashback闪回技术学习(二) 作者:weiyonghz
四、Flashback Drop and the Recycle Bin
在Oracle数据库的早期版本中,如果错误的drop了一张表,那么就只能通过把整个数据库恢复到以前的时间点的方式来恢复被错误drop的表。这个过程将会导致其他正常的事务的丢失。
Oracle 10g开始引入了Flashback Drop特性,用于撤销DROP TABLE的结果,而不需要使用point-in-time的恢复。
RECYCLEBIN初始化参数设置为ON或者OFF,决定了Flashback Drop功能打开或者关闭。如果设置为OFF,则被drop的表不会被存在于回收站(recycle bin)中;如果设置为ON,则被drop的表会存放在回收站中,并用于恢复。默认情况下RECYCLEBIN初始化参数设置为ON。
在没有启用回收站的情况下,当你drop一张表后,该表和相关对象的存储空间将立即被回收,也就是说这些被回收的存储空间可被其他对象所使用。
而如果启用回收站,当你drop一张表后,即使该表和相关对象的存储空间会显示在DBA_FREE_SPACE中,但这些存储空间是不会被立即回收的。被drop的对象会临时存放在回收站中,并仍然属于他们原来的拥有者(owner)。回收站中对象所使用的存储空间是永远不会自动回收的,除非整体的存储空间存在不足。这能够让你有足够多的时间去恢复回收站中的对象。
实际上,对一张表执行drop操作后,该表和相关的对象、约束将会自动的改成系统自动生成的名称,并移动到回收站中。目的是为了避免发生对象名称冲突的问题。
回收站本身是一个数据字典表,该表包含被drop对象的原始名称和系统自动生成的名称之间的关系。可以通告DBA_RECYCLEBIN视图查看回收站的内容。
补充:回收站是一个逻辑的概念,其实际的物理存储空间是表和相关对象所在的表空间。可以把它理解为windows操作系统的回收站。
五、从回收站中恢复表
执行flashback table
如果在回收站中对于同一个原始表具有多条记录:
->使用惟一的、系统产生的名称恢复到指定的版本
->使用被drop的表的原始名称,则被恢复的表是最后进入回收站的版本,可重复执行flashback table直到恢复出你所需要的版本。
如果在drop某张表后,又创建了一张新的同名的表,则在执行flashback table使需要指定rename to指定新的名称,否则将报错。
从回收站中恢复被drop的表后,同时被恢复的index、trigger和constraints将保留回收站中的名称。因此,在执行flashback之前先查询一下回收站和DBA_CONSTRAINTS视图中的内容。并在恢复后重新命名。
六、回收站:自动空间回收和手动空间回收
回收站中对象根据如下策略进行回收:
->执行PURGE手动清除
->根据空间需求自动清理,当某个表空间上有新的空间需求(如需要创建一张新的表)时,将按照如下顺序使用该表空间上的空闲空间:
1.首先,使用非回收站对象所占用的空闲空间(请理解一点:回收站中的对象虽然实际上占用了表空间的存储空间,但是这部分存储空间是属于空闲空间,可通过DBA_FREE_SPACE视图查看到)
2.其次,使用回收站对象占用的空闲空间,同时这些回收站中的对象将根据先进先出(FIFO)的规则被自动的从回收站中purged
3.如果表空间是自动扩展的,则会自动分配新的空闲空间。
手动清除回收站中的对象:
使用purge命令能够永久的从回收站中删除对象,当然,从回收站删除对象后就不能再使用flashback drop命令进行恢复了.
->PURGE TABLE 清除指定的表
->PURGE INDEX 清除指定的索引
语法:Purge {table
->PURGE TABLESPACE 清除指定表空间内的所有回收站对象,另外,存在于其他表空间的互相关联的对象也会被清除。也可以指定USER清除相应用户的对象。
语法:purge tablespace
->PURGE RECYCLEBIN 清除当前用户的所有对象,RECYCLEBIN相当于USER_ RECYCLEBIN
->PURGE DBA_RECYCLEBIN 清除所有对象,当然需要有足够的系统权限或者SYSDBA的权限。
语法:purge [USER_|DBA_]recyclebin