oracle flashback特性(1.1)--閃回查詢之As of timestamp

jackjw發表於2008-08-23

[@more@]

正如前言中所提,Flashback Query是利用多版本讀一致性的特性從UNDO表空間讀取操作前的記錄資料

提示:什麼是多版本讀一致性

Oracle採用了一種非常優秀的設計,透過undo資料來確保寫不堵塞讀,簡單的講,不同的事務在寫資料時,會將資料的前映像寫入undo表空間,這樣如果同時有其它事務查詢該表資料,則可以透過undo表空間中資料的前映像來構造所需的完整記錄集,而不需要等待寫入的事務提交或回滾。

flashback query種方式構建查詢記錄集(注意,要使用flashback的特性,必須啟用自動撤銷管理表空間,什麼,你想問什麼是自動撤銷管理表空間?這個,說來話長啊~~~請注意關注本篇外傳)記錄集的選擇範圍可以基於時間基於scn,甚至可以同時查詢出記錄在undo表空間中不同事務時的前映象。用法與標準查詢非常類似,要透過flashback query查詢undo中的撤銷資料,最簡單的方式只需要在標準查詢語句的表名後面跟上as of timestamp(基於時間)或as of scn(基於scn)即可

1、As of timestamp的示例:

先建立一個很簡單的表並插入一些記錄用於測試:

JSSWEB> create table jss_tb1 (id,vl) as

2 select rownum,oname from(select substr(object_name,1,1) oname from dba_objects

3 group by substr(object_name,1,1) order by 1)

4 where rownum<=20;

已建立20行。

JSSWEB> select * from jss_tb1;

ID VL

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

1 A

2 B

3 C

4 D

5 E

6 F

7 G

8 H

9 I

10 J

11 K

12 L

13 M

14 N

15 O

16 P

17 Q

18 R

19 S

20 T

已選擇20行。

刪除幾條記錄並提交:

JSSWEB> delete from jss_tb1 where id<10;

已刪除9行。

JSSWEB> commit;

提交完成。

JSSWEB> select * from jss_tb1;

ID VL

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

10 J

11 K

12 L

13 M

14 N

15 O

16 P

17 Q

18 R

19 S

20 T

已選擇11行。

你看,這個時候jss_tb1表中id<10的記錄均已被刪除,假設過了一會兒你發現刪除操作執行有誤,仍需找回那些被誤刪的記錄該怎麼辦呢?使用備份恢復?如果是在8i,恐怕是需要這樣,自9i之後,使用flashback query的特性,我們可以很輕鬆的恢復記錄(注意並不是任何情況下都可以恢復喲,後面會講到制約flashback query的一些因素,我們這裡舉的都是理想條件下的例子),假設當前距離刪除資料已經有5分鐘左右的話:

JSSWEB> select * from jss_tb1 as of timestamp sysdate-5/1440;

ID VL

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

1 A

2 B

3 C

4 D

5 E

6 F

7 G

8 H

9 I

10 J

11 K

12 L

13 M

14 N

15 O

16 P

17 Q

18 R

19 S

20 T

已選擇20行。

你看,我們透過增加as of timestamp的語法,就可以到undo表空間中查詢到5分鐘之前的記錄前映象,使用它我們就可以很輕易的並且迅速的將記錄恢復:

JSSWEB> insert into jss_tb1

2 select * from jss_tb1 as of timestamp sysdate-5/1440

3 where id<10;

已建立9行。

JSSWEB> commit;

提交完成。

JSSWEB> select * from jss_tb1;

ID VL

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

10 J

11 K

12 L

13 M

14 N

15 O

16 P

17 Q

18 R

19 S

20 T

1 A

2 B

3 C

4 D

5 E

6 F

7 G

8 H

9 I

已選擇20行。

提示:

as of timestamp|scn的語法是自9iR2後才開始提供支援,如果是9iR1版本,需要使用DBMS_FLASHBACK包來應用flashback query的特性。

如上述示例中所表示的,as of timestamp的確非常易用,但是在某些情況下,我們建議使用as of scn的方式執行flashback query,比如需要對多個相互有主外來鍵約束的表進行恢復時,如果使用as of timestamp的方式,可能會由於時間點不統一的緣故造成資料選擇或插入失敗,透過scn方式則能夠確保記錄的約束一致性。

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

相關文章