Flashback Query闪回查询

从oracle9i就提供了基本形式的闪回查询:可以查询过去某个时间的数据库状态。工作原理是将查询指定的时间映射到一个scn,每当查询找到自从该scn以来更改的一个块,它将转到撤销段以提取回滚此更改所需的撤销数据。严格上说这种回滚是临时性的,并且仅对运行闪回查询的会话可见,显然,为了成功执行闪回查询,撤销数据必须是可用的
在后续版本中,大大增强了闪回查询的功能,现在它可以用来检索一个行的所有版本,反转各个事务,或反转某个时间以来对表作出的所有更改。当然,也可以保证闪回成功执行---------但是做到这一点要付出代价:它可能引起事务失败。

注意:所有形式的闪回查询以来撤销数据来重构它在过去某个时间点的数据
(1)首先创建一个测试表regions_backup:
HR@orcl 07-OCT-14>create table regions_backup as select * from regions; 

Table created.

HR@orcl 07-OCT-14>select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
2 Americas 
3 Asia 
4 Middle East and Africa

(2)记录时间:
HR@orcl 07-OCT-14>alter session set nls_date_format='yy-mm-dd hh24:mi:ss'; 

Session altered. 

HR@orcl 14-10-07 20:17:28>select sysdate from dual; 

SYSDATE 
----------------- 
14-10-07 20:17:36

(3)从表中删除一些行,并且提交更改:
HR@orcl 14-10-07 20:17:36>delete from regions_backup where region_name like 'A%'; 

2 rows deleted. 

HR@orcl 14-10-07 20:18:35>commit; 

Commit complete. 

HR@orcl 14-10-07 20:18:24>select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
4 Middle East and Africa

(3)查询针对以前某个时间的表:
HR@orcl 14-10-07 20:22:25>select * from regions_backup as of timestamp to_timestamp('14-10-07 20:17:36','yy-mm-dd hh24:mi:ss'); 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
2 Americas 
3 Asia 
4 Middle East and Africa 

(4)查询组合实时数据和历史数据,以了解删除了哪些行。该查询的输出可以用于修复的目的,以便将那些行重新插入回表中:
HR@orcl 14-10-07 20:23:00>select * from regions_backup as of timestamp to_timestamp('14-10-07 20:17:36','yy-mm-dd hh24:mi:ss') minus select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
2 Americas 
3 Asia


尽管针对过去某个时间点的数据执行查询是有用的,但是有时也希望完成一系列选择。通过使用DBMS_FLASHBACK程序包可以将整个会话回退到过去某个时间:
SYS@orcl 07-OCT-14>grant execute on dbms_flashback to hr; 

Grant succeeded. 

HR@orcl 07-OCT-14>execute dbms_flashback.enable_at_time(to_timestamp('14-10-07 20:17:36','yy-mm-dd hh24:mi:ss')); 

PL/SQL procedure successfully completed.

HR@orcl 07-OCT-14>select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
2 Americas 
3 Asia 
4 Middle East and Africa


从此以后,所有查询将看到的数据库在指定时间的状态。其他所有会话将看到实时数据-----但是在取消闪回之前这个会话将看到一个冻结版本的数据库。

HR@orcl 07-OCT-14>update regions_backup set region_id=5 where region_name='EUROPE'; 
update regions_backup set region_id=5 where region_name='EUROPE' 

ERROR at line 1: 
ORA-08182: operation not supported while in Flashback mode 

HR@orcl 07-OCT-14>execute dbms_flashback.disable; 

PL/SQL procedure successfully completed. 

HR@orcl 07-OCT-14>select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
4 Middle East and Africa
当处于闪回模式时,无法执行DML命令,否则会抛出错误,只能执行select语句。
闪回查询(通过一个查询或使用DBMS_FLASHBACK)可以回退到多久以前取决于撤销段的内容。如果构造过时的结果集所需的撤销数据不可用,那么查询将会失败并给出一个ORA-08180错误消息“No snapshot found based on specified time“。

启用闪回查询的语法接受时间戳或scn,如果使用scn,那么闪回转到的时间点是精确的,如果指定某个时间,那么它将映射到一个scn上并且精度是3秒。

注意:可以查询以前某个时间点的数据库,但是永远不能对过去版本的数据执行DML。






请使用浏览器的分享功能分享到微信等