10g新特性——閃回版本查詢

sunwgneuqsoft發表於2008-03-10
由於粗心大意,在資料庫中誤運算元據的情況經常的發生。在9i之前,一般只能透過logminer或者時間點恢復來找回丟失的資料。在9i中出現了一種新的恢復技術——flashback,這樣我們有了一種強有力的恢復工具,可以在不影響系統的情況下在最短的時間內找到丟失的資料。但是9i中的flashback還有很多的不足,使用起來並不是很方便。在10g中對flashback進行增強,使用簡單明瞭,並且增加了對閃回版本查詢的支援。[@more@]

先舉例說明下10g中的flashbak

SQL> select * from v$version;

BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE 10.2.0.1.0 Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 – Production

SQL> create table sunwg (id number);

表已建立。

SQL> insert into sunwg values (1);

已建立 1 行。

SQL> insert into sunwg values (2);

已建立 1 行。

SQL> insert into sunwg values (3);

已建立 1 行。

SQL> commit;

提交完成。

SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'

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

20080310 11:26:20

SQL> delete from sunwg where id = 2;

已刪除 1 行。

SQL> commit;

提交完成。

SQL> select * from sunwg;

ID

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

1

3

SQL> select * from sunwg as of timestamp to_date('20080310 11:26:20','yyyymmdd hh24:mi:ss');

ID

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

1

2

3

透過flashback我們能很容易的找到被刪掉的ID = 2的記錄。但是,有的時候僅僅找到丟失的資料還遠遠不夠,我們還希望知道在這兩個時間點的變化情況。在9i中,這是很難實現的,除非做時時的檢測。在10g中,則要簡單的多。

SQL> update sunwg set id = 4 where id =3;

已更新 1 行。

SQL> commit;

提交完成。

SQL> select * from sunwg;

ID

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

1

4

現在我們透過10g新提供的閃回版本查詢來找到在兩個時間點之前表sunwg到底發生了什麼事情。

SQL> select versions_starttime,versions_endtime,versions_operation, id

2 from sunwg

3 versions between timestamp minvalue and maxvalue

4 order by VERSIONS_STARTTIME;

VERSIONS_STARTTIME VERSIONS_ENDTIME V ID

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

10-3 -08 11.25.44 10-3 -08 11.31.24 I 3

10-3 -08 11.25.44 10-3 -08 11.26.38 I 2

10-3 -08 11.25.44 I 1

10-3 -08 11.26.38 D 2

10-3 -08 11.31.24 U 4

上面這個查詢就是10g新提供的閃回版本查詢特性。從這個結果我們能看到ID = 3的記錄是在112544秒插入到資料的,然後是在113124秒生命終止了,我們知道在這個時刻ID = 3的被更新為ID = 4的記錄了。我們看ID = 4這條記錄也可以看得出來,這條記錄是在113124的時候被更新了。

做過資料倉儲的人應該很清楚這就是最基礎的記歷史的格式,在資料倉儲中為了記錄歷史資訊,所以每條記錄都會自己的生命週期資訊,一般得到這樣的資訊需要進行大量的查詢和比對工作。但是利用10g的新特性,我們能很輕易的查詢到這樣的資訊。

在上述查詢中,列 versions_starttimeversions_endtimeversions_xidversions_operation 是偽列,與 ROWNUMLEVEL 等其他熟悉的偽列相類似。其他偽列 VERSIONS_STARTSCN VERSIONS_ENDSCN — 顯示了該時刻的系統更改號。列 versions_xid 顯示了更改該行的事務識別符號。有關該事務的更多詳細資訊可在檢視 FLASHBACK_TRANSACTION_QUERY 中找到,其中列 XID 顯示事務 id。例如,透過查詢FLASHBACK_TRANSACTION_QUERYVERSIONS_XID 值等於 000A000D00000029的記錄,我們可以得到實際的語句UNDO_SQL

最大的可用版本依賴於 UNDO_RETENTION

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

相關文章