應用oracle flashback--Flashback Table之RECYCLEBIN
繼續轉載,三思不會追究我盜版吧.
http://space.itpub.net/7607759/action-spacelist
[@more@]簡單來講,如果我們把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;
閃回完成。
某些時候,我們要處理的表並不是被意外刪除,而是被反覆修改過多次,希望能回覆到之前的某個時間點,透過前面的,你一定會說沒問題啊,藉助flashback query就可以,沒錯,flashback query確實可以,但flashback query只是查詢出記錄,如果想做恢復還需要寫出相應的insert或update,也許還需要相當多的where條件做判斷,一個不甚,可能恢復的資料就是錯誤的。老闆又沒在跟兒前站著,我們沒必要在這個時刻用這種方式展示我們嫻熟的指法,因此,我們需要更高效更嚴謹更簡便的方式:flashback table tbname to scn/timestamp,助你達成夢想,詳情請諮詢,o錯了,應該是詳情請接著往下看。
Scn和timestamp的用法透過前面flashback query的學習大家應該都比較熟了,flashback table中指定scn或timestamp的用法與上相同,舉個例子吧:
有資料如下:
JSSWEB> select *from jss_tb1;
ID VL
---------- --------------------
6 F
7 G
8 H
9 I
11 K
12 L
13 M
14 N
15 O
10 J
記錄下當前系統scn(如果不知道確切的scn,恢復時只能透過時間,但正如前文中講到的,時間並不精確,如果透過指定timestamp恢復的話,需要你清楚瞭解所做的操作大概是在什麼時間)
JSSWEB> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
593480
我們對該表做些操作:
JSSWEB> update jss_tb1 set id=id+100 where id>10;
已更新5行。
JSSWEB> insert into jss_tb1 values (21,'Z');
已建立 1 行。
JSSWEB> delete jss_tb1 where id=8;
已刪除 1 行。
JSSWEB> commit;
提交完成。
JSSWEB> select *from jss_tb1;
ID VL
---------- --------------------
21 Z
6 F
7 G
9 I
111 K
112 L
113 M
114 N
115 O
10 J
已選擇10行。
這些都屬於常規操作,如果最終發現這些操作都屬於誤操作,需要恢復回表最初的形式,藉助flashback query當然可以實現:
JSSWEB> select *from jss_tb1 as of scn 593480;
ID VL
---------- --------------------
6 F
7 G
8 H
9 I
11 K
12 L
13 M
14 N
15 O
10 J
已選擇10行。
查詢能夠寫出來,就一定能將表更新回去,不過既使是針對我們測試時所做過的簡單操作(新增、刪除、修改),更新的語句就已經需要寫的很複雜了,因為我們需要分別判斷新增、刪除、修改過的記錄。
幸好,我們還有flashback table,因此我們只需要指定一個scn或timestamp即可。
JSSWEB> flashback table jss_tb1 to scn 593480;
完成。
JSSWEB> select *from jss_tb1;
ID VL
---------- --------------------
6 F
7 G
8 H
9 I
11 K
12 L
13 M
14 N
15 O
10 J
已選擇10行。
所有記錄均已回覆到指定scn時的狀態。
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. 相對於被刪除的表而言,當資料檔案空間不足時,會首先清理被刪除表的索引,因此假如你執行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都會被清空,不過這種方式好像狠了點兒,慎用啊~~~~~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1008087/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【徵文】應用oracle flashback(2.1)--Flashback Table之RECYCLEBINOracle
- oracle flashback特性(2.1)--Flashback Table之RECYCLEBINOracle
- 應用oracle flashback--Flashback Database介紹OracleDatabase
- 全面學習oracle flashback特性(2.1)--Flashback Table之RECYCLEBINOracle
- 【徵文】應用oracle flashback(2.3)--Flashback Table之注意事項Oracle
- Oracle Recyclebin - purgeOracle
- recyclebin in ORACLE 10Oracle
- 【徵文】應用oracle flashback(2.2)--Flashback Table之從UNDO中恢復Oracle
- oracle recyclebin詳解Oracle
- Oracle recyclebin介紹Oracle
- oracle recyclebin和flashbackOracle
- oracle之nalyze tableOracle
- oracle10g recyclebinOracle
- recyclebin for oracle 10gOracle 10g
- Oracle 基本操作之 tableOracle
- Oracle10g的recyclebinOracle
- oracle 之特殊funxtions應用Oracle
- oracle之profile的應用Oracle
- oracle之 profile的應用Oracle
- partition table中truncate應用
- 【RECYCLEBIN】Oracle回收站詳解Oracle
- oracle10g recyclebin 詳解Oracle
- 清除oracle的recyclebin回收站Oracle
- How to maintain Oracle10g RecyclebinAIOracle
- display:table-cell的應用
- pt-table-checksum工具應用
- Oracle10g 的Recyclebin簡介Oracle
- 【故障-ORACLE】定時清理dba_recyclebinOracle
- 啟用oracle table rowdependencies trace row modificationOracle
- 【recyclebin】徹底禁用 Oracle回收站功能Oracle
- Oracle sys/system使用者下刪除表為什麼沒有被rename 到 recyclebin table(回收站)Oracle
- oracle 練習之table初始化scriptOracle
- [Oracle] Partition table exchange Heap tableOracle
- Flink Table Store 典型應用場景
- ORACLE SQL調優之'PLAN_TABLE' is old versionOracleSQL
- Linux recyclebinLinux
- oracle temporary tableOracle
- oracle shrink tableOracle