【徵文】全面學習oracle flashback特性(1.1)--閃回查詢之As of timestamp

junsansi發表於2008-06-26

Flashback是ORACLE自9i就開始提供的一項特性,在9i中利用oracle查詢多版本一致的特點,實現從回滾段中讀取表一定時間內操作過的資料,可用來進行資料比對,或者修正意外提交造成的錯誤資料,該項特性也被稱為Flashback Query。在10g中Flashback又得到了相當大的增強,利用回收站和閃回區的特性實現快速恢復刪除表(Flashback Table)或做資料庫時間點恢復(Flashback Database)的功能。本文將分三個部分分別介紹!

提示:

關於flashback這個詞的翻譯呢,有很多:有叫回閃的,有叫閃回的。雖然三思個人認為相對來說閃回更通行一些,但在本系列文章中,我將堅持不做翻譯,而直稱為flashback。我覺著某些詞彙不應做翻譯,一方面是由於找不著合適的詞來做轉換,另一方面也有使用習慣的原因,比如oracle公司雖然大家都知道其中文名稱叫甲骨文,但日常交流中大家都習慣說oracle就是這個道理。

一、Flashback Query

正如前言中所提,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方式則能夠確保記錄的約束一致性。

如何應用as of scn的方式查詢undo資料呢?請繼續關注後續連載~~

 

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

相關文章