Flashback drop用于在回收站(recycle bin)里保存drop的数据库对象和独立的对象,以备不时之需,恢复这些对象。Drop的对象一直存在于回收站里,直到回收站被清空。这对于用户来说提供了一种恢复意外drop的表的方式。在10G以前的版本里,遇到这种情况,你最可能做一个incomplete数据库恢复,引入或者使用log miner来恢复被drop的数据库对象。Falshback drop恢复速度明显比以前可以使用的方式快,并且这一过程并不会影响到其他用户,而incomplete恢复会有database范围的影响,因为database和datafile的恢复可能影响多个数对象。看一下一个使用FALSHBACK TABLE table_name TO BEFORE DROP 命令的flashback drop的例子。
SQL〉flashback table t1 to before drop;
很多时候,用户可能因为犯错drop 表或者drop掉错误的表。Flashback drop设计用来临时存储那些drop的对象及依赖其的对象一段时间,这些可以在recycle bin里察看。如有必要,用户可以恢复这些对象。
为了全面理解flashback drop,我们需要详细了解recycle bin是如何工作的,需要知道recycle bin是怎么存储内容的,包括名字转换及其版本,需要理解空间的使用和局限,另外,我们需要能够查询和清空recycle bin里的内容。
Recycle bin 逻辑上是所有被drop的表及依赖其存在的对象的存储容器。就像上面提到的,当一个表被drop掉,Recycle bin存储这个表和依赖这个表而存在的对象已备恢复之用。那些依赖表而存在的对象包括索引、约束、触发器、嵌套表、LOB区段和LOGB所以区段。下面我们将介绍怎样使用Recycle bin,包括包括对象是怎么存储的,对象名字的转换和查询对象。我们也将介绍和演示空间压力,清空Recycle bin和空间应用。
Recycle bin在10G里是默认使用的。Recycle bin接收到数据库对象当drop table命令被运行。当这个命令运行了,表和依赖其存在的对象如索引等被存储在Recycle bin里,我们需要用flashback drop的能力来恢复这些对象。以下例子解释怎样使用。
SQL> select * from t;
DEPTNO DNAME LOC
---------- -------------- ---------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> drop table t;
Table Dropped
当表被drop掉,我们可以在Recycle bin里看到这张表和依赖它的对象。这些对象有一个独一无二的名字转换,以支持不同用户drop的相同名字的对象的存储与恢复。不用的用户drop相同名字的对象是可能的,因此oracle采用了这种命名方式。这种命名方式包含一个全局UID,它是24个字符长的,和一个数据库分配的版本号。格式如此BIN$globalUID$version。其名字总是30个字符。
SHOW RECYCLEBIN 用于查看Recycle bin里的内容。Recycle bin也可以查看动态视图USER_RECYCLEBIN和DBA_RECYCLEBIN来查看。让我们看一下SHOW RECYCLEBIN命令在sqlplus的使用。
SQL> show recyclebin
ORIGINAL NAME
RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T
BIN$g+6dAPUiTlCU0Z5OELs9Ng==$0 TABLE 2008-03-02:19:51:00
下一步,让我们使用标准sql语句查看recyclebin视图里的内容。
SQL> select object_name,original_name,object_name from recyclebin;
OBJECT_NAME
ORIGINAL_NAME OBJECT_NAME
------------------------------
BIN$g+6dAPUiTlCU0Z5OELs9Ng==$0 T BIN$g+6dAPUiTlCU0Z5OELs9Ng==$0
drop表的内容,通过Recycle bin可以像查看其他数据那样的查询。为了查询recycle bin的内容,我们必须需要有表被drop前操作权限和放入recycle bin的权限。同时,需要falshback权限。让我们通过object_name查询recycle bin里表t的内容:
SQL> select * from "BIN$g+6dAPUiTlCU0Z5OELs9Ng==$0";
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL>
使用flashback drop来恢复表t的过程是很简单的,flashback drop简单的undos表的drop命令和把那些对象从recycle bin里移出。通过指定在recycle bin里的OBJECT_NAME,使用flashback table table_name to before drop命令。我们也可以增加RENAME TO table_name选项来修改表的名字。同时可以看到,恢复后的内容将不会存在于recycle bin里,当flashback drop命令执行后,对象将从recycle bin里移出。
让我们使用flashback drop来恢复表t,并且改名为t1。
SQL> flashback table "BIN$g+6dAPUiTlCU0Z5OELs9Ng==$0" to before drop rename to t1;
闪回完成
SQL> select * from t1;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> show recyclebin
SQL>
可以看到,使用recycle bin和flashback drop是很简单的。在10G里,被drop的表和依赖其的对象自动的存储在recycle bin里,这些对象可以使用flashback drop恢复。
下面我们更详细的讨论recycle bin的活动,包括每天的操作影响,包括空间利用和管理。
Recycle bin 在数据库里需要更多地使用空间,因为drop的内容仍旧存储在数据库里。这意味着为这些内容原先分配的空间在原来的标空间里依旧保存着一段时间。这届drop的对象花费的空间仍然占据着标空间配额。
有一种方法来drop对象,并且回收与之相关的空间。当然,意味着你不能从recycle bin里恢复这些对象。要永久的删除这些对象并且回收空间,我们可以用PURGE RABLE original_name命令。这个命令提供了10g之前数据库的drop table功能。你也可以通过PURGE TABLE recycle_bin_object_name命令来清除对象,如下例所示。
SQL> purge table "BIN$g+6dAPUiTlCU0Z5OELs9Ng==$0"
也有一个命令用于清除指定表空间里的recycle bin里的对象。这个命令是PURGE TABLESPACE,PURGE TABLESPACE清除指定表空间里所有的drop的表及依赖其存在的对象。依赖的对象,包括lobs,嵌套表和分区将被从指定的表空间里清除,包括存储在其他标空间里的基表,因为那些依赖的对象都依赖于基表的存在而存在。指令PURGE TABLESPACE tspace USER usr只清除指定用户的内容
SQL> purge tablespace users user scott;
命令DROP USER user CASADE drop指定的用户和该用户所有的对象。这些对象不存储于recycle bin 里,同样,该用户在recycle bin里对象也将被清除。指令DROP USER绕过了recycle bin,直接删除内容。
Recycle bin里的内容如果需要也可以被清除,两条指令:
1. PURGE RECYCLEBIN用来清除该用户自己的recycle bin,该指令清除该用户在recycle bin里的对象,并且释放这些对象占有的空间。
2. PURGE DBA_RECYCLEBIN命令用于清除recycle bin所有用户的对象,这种方式有效的清除了recycle bin的所有内容,当然,必须有sysdba的权限。
SQL> purge recyclebin
SQL> conn / as sysdba
SQL> purge dba_recyclebin
Recycle bin 逻辑上是在表空间里已经分配空间的drop对象的存储容器,。这就意味着不需要为recycle bin提前分配空间。这使得recycle bin空间依赖的空间已经存在于标空间里。因此,对象存储在recycle bin里的最小时间是不能保证的。
被drop的对象保存在recycle bin里直到在该对象所属的表空间里新的区间不能分配了。这种情形就是space pressure。用户空间配额也可以强制出现space pressure情形。即使这样,标空间里仍然存在自由空间,用户配额限制了其应用。
当space pressue 出现,oracle自动的通过覆盖对象的方法收回recycle bin的空间。Oracle通过FIFO,先进先出的方式选择清除对象,最先drop的对象最先选择被清除。对象的清除动作只有出现space pressure情形时才会执行,并且数据库清除最少以能够满足space pressure需求。这种最低限要求的方式降低了对事物操作的影响,并且最大化的保持对象存储在recycle bin里的时间。
限制:
Ø Recycle bin功能只能用于non-system,本地管理的表空间
Ø 对于recycle bin存储,没有时间保证,由系统活动对空间利用的影响决定
Ø DML和DDL语句不能用于recycle bin对象
Ø Recycle bin里的名字来查询,不能用原先的名字
Ø 当执行flashback drop后,所有依赖的对象都将被恢复,除了因为space pressure被清除的对象
Ø 出于安全原因,在表上定义的virtual private database 和fine-grained auditing 方针不受保护
Ø 分区的索引表不会受到recycle bin保护
另外,引用约束不受recycle bin保护。引用约束在表恢复以后必须repalced。
注 原文来自oracle 10g 1z043