我最近了解到 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 参数的限制,通常是几小时而不是几天。
需要注意的一点是,这种闪回查询依赖于写入 UNDO 表空间的 UNDO 信息。而且这些信息不会永远保留——大多数处于合理负载下的生产系统不会有 24 小时的 UNDO 信息可用。
根据 Oracle 版本,您可能需要将该UNDO_RETENTION
参数设置为比您尝试闪回的时间段更长的值。
SELECT *
FROM sometable
VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp
将为您提供最后一天所有行的所有版本。
你可以用这个做更多的事情。查看文档(您可能希望找到适合您的版本的文档)。