2008-12-11 51 views
3

我最近了解到,oracle有一個對我非常有用的功能 - 由於設計者/實現者不關心數據歷史 - 我可以查詢歷史狀態記錄它是否可用在oracle緩存中,如下所示:Oracle記錄歷史使用範圍內的時間戳

select * 
    from (select * 
      from sometable where some_condition) 
as of timestamp sysdate-1 

但是現在我需要檢查一個範圍內的歷史數據。無論如何,使用緩存?

回答

8

是的,是這樣的:

SQL> select sal from emp where empno=7369; 

     SAL 
---------- 
     5800 

SQL> update emp set sal = sal+100 where empno=7369; 

1 row updated. 

SQL> commit; 

Commit complete. 

SQL> update emp set sal = sal-100 where empno=7369; 

1 row updated.  

SQL> commit; 

Commit complete. 

SQL> select empno, sal, versions_starttime,versions_xid 
    2 from emp 
    3 versions between timestamp sysdate-1 and sysdate 
    4 where empno=7369; 

    EMPNO  SAL VERSIONS_STARTTIME               VERSIONS_XID 
---------- ---------- --------------------------------------------------------------------------- -- 
     7369  5900 11-DEC-08 16.05.32               0014001300002A74 
     7369  5800 11-DEC-08 16.03.32               000D002200012EB1 
     7369  5800 

注意多遠回你可以通過UNDO_RETENTION參數限制,通常是幾小時而不是幾天。

0
SELECT * 
    FROM sometable 
    VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp 

將在最後一天爲您提供所有行的所有版本。

你可以用這個做很多事情。看看documentation(你可能想找到你的版本的文檔)。

2

需要注意的一點是,此類閃回查詢依賴於寫入UNDO表空間的UNDO信息。而且這些信息不會永久保留 - 大多數合理負載下的生產系統都不會有24小時的UNDO信息。

根據Oracle版本的不同,您可能需要將UNDO_RETENTION參數設置爲比您嘗試閃回的時間段更長的值。