2008-12-11 32 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参数设置为比您尝试闪回的时间段更长的值。