2013年(350)
分类: Oracle
2013-04-25 11:10:39
简单来讲,如果我们把flashback query看做是恢复记录,则flashback table就是用来恢复表的(由于记录是以表为载体存储,因此flashback table也应该看做是恢复记录,只不过相对于flashback query而言,其粒度更大一些),同时呢,在Oracle10g中又新引入了一个叫做Recycle Bin的功能(主要针对表及其关联的对象,比如索引约束啥的),被删除的表并非真正删除,而是先通过修改数据字典的方式,将其改名并放入recyclebin,如果要恢复recycle bin中对象的话,借助flashback table是最简便的方式。除此之外,flashback table也提供了类似flashback query中as of scn/timestamp的方式,借助undo数据,直接将现有的表恢复到某个指定的时间点或scn时的状态。
下面分别举例:
2.1、从RECYCLEBIN中恢复
要恢复recyclebin中的表,注意语句如下:Flashback table [objName] to before drop,这个obj_name即可以是表名,也可以是recyclebin中的对象表(支持同时操作多个表,表名之间以逗号分隔即可),由于该项功能是恢复被删除表,因此官方对其还有另外一称谓:flashback drop。
下面举个例子,从recyclebin中恢复一个被删除的表:
JSSWEB> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$u/7I62WxS12jMVO358SFgw==$0 JSS_TB3
JSSWEB> select object_name,original_name from recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
BIN$u/7I62WxS12jMVO358SFgw==$0 JSS_TB3
JSSWEB> flashback table jss_tb3 to before drop;
完成。
JSSWEB> select object_name,original_name from recyclebin;
未选定行
Flashback table语句同时提示了一个rename to [newTBname]的子句,如果要恢复的表在当前schema中已经存在同名的表,建议你在恢复时通过rename to 子句为待恢复的表指定一个新的表名,不然会报ORA-38312错误,再举个例子:
JSSWEB> drop table jss_tb3;
表已删除。
JSSWEB> create table jss_tb3 as select *from jss_tb1;
表已创建。
JSSWEB> flashback table jss_tb3 to before drop;
flashback table jss_tb3 to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用
你看,正如其提示的那样,该表被删除之后,又执行过创建同名表的操作,因此恢复的时候就会报错,怎么办呢,用rename to.....
JSSWEB> flashback table jss_tb3 to before drop rename to jss_tb3_bak;
闪回完成。
===================================