代码之家  ›  专栏  ›  技术社区  ›  Zsolt Botykai

在一个范围内使用“从开始”时间戳的Oracle记录历史记录

  •  3
  • Zsolt Botykai  · 技术社区  · 16 年前

    我最近了解到Oracle有一个对我非常有用的功能——因为设计人员/实现人员不太关心数据历史——如果记录在Oracle缓存中可用,我可以查询它的历史状态,如下所示:

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

    但现在我需要检查一个范围内的历史数据。不管怎样,是否可以使用缓存?

    3 回复  |  直到 16 年前
        1
  •  8
  •   Tony Andrews    16 年前

    是的,像这样:

    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
    

    请注意,撤消保留参数限制了您可以返回的时间,通常是几小时而不是几天。

        2
  •  2
  •   Justin Cave    16 年前

    需要注意的一点是,这种类型的回闪查询依赖于写入撤消表空间的撤消信息。而且这些信息不会永久保留——大多数生产系统在合理的负载下不会有24小时的撤消信息可用。

    根据Oracle版本的不同,您可能需要设置 UNDO_RETENTION 参数设置为一个值,该值大于您试图闪回的时间段。

        3
  •  0
  •   Dave Costa    16 年前
    SELECT *
      FROM sometable
      VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp
    

    将在最后一天提供所有行的所有版本。

    你可以用这个做更多的事情。退房 documentation (您可能希望找到您的版本的文档)。