oracle flashback特性(1.2)--閃回查詢之As of scn

jackjw發表於2008-08-23

[@more@]

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


1、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,會理解的更深刻一些。

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

相關文章