全面學習oracle flashback特性(2.3)--Flashback Table之注意事項

junsansi發表於2008-07-07

a.基於undo的表恢復,被恢復的表必須啟用row movement,不然會報ORA-08189錯誤,關於row movement的相關知識,三思在"全面學習分割槽表及分割槽索引"一文中有過闡述,這裡就不多費口舌了。

[@more@]

3、注意事項

a.基於undo的表恢復,被恢復的表必須啟用row movement,不然會報ORA-08189錯誤,關於row movement的相關知識,三思在"全面學習分割槽表及分割槽索引"一文中有過闡述,這裡就不多費口舌了。

要檢視某表是否啟用row movement,可以到user_tables中查詢(或all_tables,dba_tables),例如:

JSSWEB> select row_movement from user_tables where table_name='JSS_TB1';

ROW_MOVE

--------

ENABLED

要啟用或禁止某表row movement,可以通過下列語句:

--啟用

JSSWEB> ALTER TABLE JSS_TB1 ENABLE ROW MOVEMENT;

表已更改。

--禁止

JSSWEB> ALTER TABLE JSS_TB1 DISABLE ROW MOVEMENT;

表已更改。

b. 基於undo的表恢復,需要注意前文制約因素1.5.3中提到的ddl的影響。

c. 基於undo的表恢復,flashback table實際上做的也是dml操作(會在被操作的表上加dml鎖),因此還需要注意triggers對其的影響,預設情況下,flashback table to scn/timestamp在執行時會自動disable掉與其操作表相差的triggers,如果你希望在此期間trigger能夠繼續發揮做用,可以在flashback table後附加 ENABLE TRIGGERS子句。

d. 基於undo的表恢復,索引會自動維護,但統計資訊並不會恢復到指定的時間點。

e. 基於recycle bin的表恢復,flashback drop不能恢復參照完整性,這很容易理解,畢竟在該表刪除之後,其被參照表是否有修改它已經無法控制了,因此如果該表有主外來鍵約束的話,恢復之後,該約束是disable狀態,需要dba手工處理。

f. 基於recycle bin的表恢復,所操作的表必須是存在於本地管理表空間中。Flashback drop不能恢復字典管理表空間中被刪除的表,也不能恢復系統表。

g. 基於recycle bin的表恢復,被恢復的表的關聯物件,比如其索引啦,約束的名稱不會自動恢復成刪除前的名稱,而是系統自動生成的名稱,如果你對錶的索引約束有相關命名規範,那在恢復表之後,需要dba手工將索引約束等改名。

h. 當刪除表時,信賴於該表的物化檢視也會同時刪除,但是由於物化檢視並不會被放入recycle bin,因此當你執行flashback table to before drop時,也不能恢復依賴其的物化檢視,需要dba手工介入重新建立。

i. 相對於被刪除的表而言,當資料檔案空間不足時,oracle會首先清理被刪除表的索引,因此假如你執行flashback table to before drop而發現缺少索引可能是正常的,說明你顯然錯過了最佳的恢復時機。

j. Flashback table命令支援同時操作多個表,表名中間以逗號分隔即可,如果你執行一條flashback table命令時同時指定了多個表,要記住單個flashback table是在同一個事務中,因此這些表的恢復操作要麼都成功,要麼都失敗。

附B:

提示:什麼是Recycle Bin(回收站)

在三思之前的一些筆記中,我們曾經數次提到過這個東西,當然那些文章中介紹的都比較簡單,僅僅只是一筆帶過,這裡呢也不準備太細緻的講解和介紹,因為這個東西確實很簡單,你可以把它看成是windows中的回收站,在windows中我們刪除一些檔案的話,windows並非直接刪除,而是直接將檔案移至回收站資料夾下,Oracle中也是一樣,當你刪除一個表的時候,資料庫並非真正立刻執行刪除的操作,而是將其重新命名,連同其相關聯的一些物件,如表的索引、約束等統統放入recycle bin。

每一個使用者都會有一個自己的recycle bin,就像windows中每個碟符下都會有一個recycle目錄(對應回收站)一樣,要檢視recycle bin中物件,直接:

JSSWEB> select *from recyclebin;

即可。

我們都知道在windows中刪除的同時如果按著Shift則檔案將會被真正刪除(不鑽牛角尖,我是說windows將其刪除,至於你通過recovery之類工具還可再將其從磁碟恢復不再此例範圍之內),那麼對於oracle是否也有一種方式能夠讓我們執行的刪除不再被放入回收站呢?答案當然是肯定,而且oracle又提供了不止一種方式(咦,為什麼要說又呢)~~~~~

第一種方式:刪除時指定purge引數(等同於我們在windows中按著shift刪除),例如:

JSSWEB> drop table jss_tb3 purge;

表已刪除。

JSSWEB> select *from recyclebin;

未選定行

第二種方式:修改初始化引數recyclebin=off,例如:

JSSWEB> create table jss_tb3 (id number);

表已建立。

JSSWEB> show parameter recyclebin

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

recyclebin string on

JSSWEB> alter session set recyclebin = off;

會話已更改。

JSSWEB> show parameter recyclebin

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

recyclebin string OFF

JSSWEB> drop table jss_tb3;

表已刪除。

JSSWEB> select *from recyclebin;

未選定行

這裡我們只針對當前session,如果希望針對整個例項,通過alter system set recyclebin=off,或者修改pfile中recyclebin引數,將其設定為off。這樣所有drop table操作都會直接刪表,而不再轉移到recycle bin,這就相當於禁用了recycle bin功能,如果某天你又想啟用該功能,只需要將該初始化引數設定為on即可。

對於已存在於recyclebin字典中的物件,如果想徹底刪除該怎麼辦呢,Oracle再一次提供了多種方式,以及多種粒度來執行刪除。

先建個測試用的環境:

JSSWEB> create table jss_tb3 (id number);

表已建立。

JSSWEB> alter session set recyclebin=on;

會話已更改。

JSSWEB> select object_name,original_name from recyclebin;

OBJECT_NAME ORIGINAL_NAME

------------------------------ --------------------------------

BIN$JhA057bpRxKICIe/vNahyQ==$0 JSS_TB3

A.Purge指定表,例如:

JSSWEB> purge table jss_tb3;

JSSWEB> purge table "BIN$JhA057bpRxKICIe/vNahyQ==$0";

B.Purge指定表空間,例如:

JSSWEB> purge tablespace webtbs;

C.清空recyclebin,例如:

JSSWEB> purge recyclebin;

除上述的三種之外,還有一種方式就是刪除recycle bin中物件所屬使用者或所在表空間,這樣甭管你是否purge,recycle bin都會被清空,不過這種方式好像狠了點兒,慎用啊~~~~~

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

檢視之前的連載:

(2.2)--Flashback Table之從UNDO中恢復

(2.1)--Flashback Table之從RECYCLEBIN恢復

(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-1006876/,如需轉載,請註明出處,否則將追究法律責任。

相關文章