我最近了解到,oracle有一個對我非常有用的功能 - 由於設計者/實現者不關心數據歷史 - 我可以查詢歷史狀態記錄它是否可用在oracle緩存中,如下所示:Oracle記錄歷史使用範圍內的時間戳
select *
from (select *
from sometable where some_condition)
as of timestamp sysdate-1
但是現在我需要檢查一個範圍內的歷史數據。無論如何,使用緩存?
我最近了解到,oracle有一個對我非常有用的功能 - 由於設計者/實現者不關心數據歷史 - 我可以查詢歷史狀態記錄它是否可用在oracle緩存中,如下所示:Oracle記錄歷史使用範圍內的時間戳
select *
from (select *
from sometable where some_condition)
as of timestamp sysdate-1
但是現在我需要檢查一個範圍內的歷史數據。無論如何,使用緩存?
是的,是這樣的:
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參數限制,通常是幾小時而不是幾天。
SELECT *
FROM sometable
VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp
將在最後一天爲您提供所有行的所有版本。
你可以用這個做很多事情。看看documentation(你可能想找到你的版本的文檔)。
需要注意的一點是,此類閃回查詢依賴於寫入UNDO表空間的UNDO信息。而且這些信息不會永久保留 - 大多數合理負載下的生產系統都不會有24小時的UNDO信息。
根據Oracle版本的不同,您可能需要將UNDO_RETENTION
參數設置爲比您嘗試閃回的時間段更長的值。