【徵文】應用oracle flashback(2.1)--Flashback Table之RECYCLEBIN

junsansi發表於2008-07-03

簡單來講,如果我們把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;

閃回完成。

===================================

檢視前面的連載:

(1.5)--閃回查詢之制約因素

(1.4)--閃回查詢之Transaction query

(1.3)--閃回查詢之Versions between

(1.2)--閃回查詢之As of scn

(1.1)--閃回查詢之As of timestamp

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-368973/,如需轉載,請註明出處,否則將追究法律責任。

相關文章