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

junsansi發表於2008-06-27

2、As of scn的示例

仍以前文中建立的表為例,既然是基於scn的查詢,我們首先就需要得到scn,這裡我們通過dbms_flashback.get_system_change_number函式來獲取oracle當前的scn,之後再執行資料的修改操作。

JSSWEB> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

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

                  344197

JSSWEB> delete jss_tb1 where id>10;

已刪除10行。

JSSWEB> commit;

提交完成。

JSSWEB> select * from jss_tb1 as of scn 344197;

        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行。

執行insert,將刪除的資料重新恢復回表jss_tb1

JSSWEB> insert into jss_tb1 select *from jss_tb1 as of scn 344197

  2  where id not in(select id from jss_tb1);

已建立10行。

JSSWEB> commit;

提交完成。

事實上,Oracle在內部都是使用scn,即使你指定的是as of timestamp,oracle也會將其轉換成scn,系統時間標記與scn之間存在一張表,即SYS下的SMON_SCN_TIME

JSSWEB> desc sys.smon_scn_time;

 名稱                                        是否為空? 型別

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

 THREAD                                      NUMBER

 TIME_MP                                    NUMBER

 TIME_DP                                    DATE

 SCN_WRP                                    NUMBER

 SCN_BAS                                    NUMBER

 NUM_MAPPINGS                               NUMBER

 TIM_SCN_MAP                                RAW(1200)

 SCN                                        NUMBER

 ORIG_THREAD                                 NUMBER

每隔5分鐘,系統產生一次系統時間標記與scn的匹配並存入sys.smon_scn_time表,該表中記錄了最近1440個系統時間標記與scn的匹配記錄,由於該表只維護了最近的1440條記錄,因此如果使用as of timestamp的方式則只能flashback近5天內的資料(假設系統是在持續不斷執行並無中斷或關機重啟之類操作的話)。注意理解系統時間標記與scn的每5分鐘匹配一次這句話,舉個例子,比如scn:339988,339989分別匹配08-05-30 13:52:00和2008-13:57:00,則當你通過as of timestamp查詢08-05-30 13:52:00或08-05-30 13:56:59這段時間點內的時間時,oracle都會將其匹配為scn:339988到undo表空間中查詢,也就說在這個時間內,不管你指定的時間點是什麼,查詢返回的都將是08-05-30 13:52:00這個時刻的資料。

當然,具體的情況,我想你親自執行一下select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') from sys.smon_scn_time,會理解的更深刻一些。

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

檢視前面的連載:

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

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

相關文章