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。






来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29800581/viewspace-1314386/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29800581/viewspace-1314386/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值