闪回查询:
闪回查询的工作原理是:将查询指定的时间映射到一个系统变更号和SCN,每当查询找到自从该SCN以来更改
的一个块,它将转到撤销段以提取回滚此更改所需的撤销数据。严格来说,这种回滚是临时性的,并且仅对
运行闪回查询的会话可见。显然,为了成功执行闪回查询,撤销数据必须是可用的.
在后续Oracle版本中,大大增强了闪回查询功能,现在它可以用来检索一个行的所有版本,反转各个事务
,或反转某个时间以来对表做出的所有更改。当然,也可以保证闪回执行成功---但是做到这一点要付出代价:它可能会引起事务失败。
(注:所有形式的闪回查询依赖撤销数据来重构它在过去某个时间点的数据).
如下是一个基本的闪回查询:
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
会话已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2013-08-12 09:28:01
(2)
SQL> select * from test;
ID
----------
1
2
3
4
5
6
7
8
9
10
已选择10行。
(3)
SQL> delete from test where id>=6;
已删除5行。
SQL> commit;
提交完成。
(4)
SQL> select * from test;
ID
----------
1
2
3
4
5
(5)
SQL> select * from test as of timestamp to_timestamp('13-08-12 09:28:01','yy-mm-
dd hh24:mi:ss');
ID
----------
1
2
3
4
5
6
7
8
9
10
已选择10行。
(6)
SQL> select * from test as of timestamp to_timestamp('13-08-12 09:28:01','yy-mm-
dd hh24:mi:ss')
2 minus
3 select * from test;
ID
----------
6
7
8
9
10
虽然针对过去某个时间点的数据执行查询是有用的,但有时也希望完成一系列的选择。通过dbms_flashback程序包可以将整个会话回退到过去某个时间:
SQL> execute dbms_flashback.enable_at_time(to_timestamp('13-08-12 09:28:01','yy-
mm-dd hh24:mi:ss'));
执行完这个命令,所有的查询将看到数据库在指定的时间的状态。其他所有会话将看到实时数据---但是在
取消闪回之前这个会话将看到一个冻结版本的数据库:
SQL> execute dbms_flashback.disable;
在处于闪回模式时,无法执行DML命令。如果这样做会抛出错误,只能执行select语句。
闪回查询(通过一个查询或使用dbms_flashback)可以回退到多久以前取决于撤销段的内容。如果构造过时
的结果集所需的撤销数据不可用,那么查询将会失败并给出一个ORA—08180错误。
启用闪回查询的语法接受时间戳或SCN。如果使用SCN,那么闪回转到的时间点是精确的,如果指定某个时间,那么它将映射到一个SCN上并且精度是3秒。
(注:可以查询以前某个时间点的数据库,但是永远不能对过去版本的数据执行DML)