ITPub博客

首页 > 数据库 > Oracle > Oracle 闪回查询教程

Oracle 闪回查询教程

Oracle 作者:bestpaydata 时间:2016-03-15 17:16:48 0 删除 编辑

author: zy
今天开发人员问我如何快速并方便的查出一张表最近被更改的记录,这个需求很简单,由于是查最近被更改的数据,查回滚段就可以,下面是我做的小实验。



SQL>
create table test(id number,name varchar2(10),gender varchar2(5));



表已创建。



SQL>
insert into test values(1,'
宋春风','男');  
已创建 1 行。



SQL>
insert into test values(2,'
叶民','男');     
已创建 1 行。



SQL>
insert into test values(3,'
白冰','男');     
已创建 1 行。



SQL>
insert into test values(4,'
方巍森','男');  
已创建 1 行。



SQL>
insert into test values(5,'
孙书祯','男');  
已创建 1 行。



SQL>
insert into test values(6,'
史波','男');     
已创建 1 行。



SQL>
commit;                    
                       
提交完成。



利用下面的SQL就可以查处最近更改的数据。



SQL>
SELECT ID,NAME,VERSIONS_STARTTIME,VERSIONS_ENDTIME,VERSIONS_OPERATION 



FROM
TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE WHERE 



VERSIONS_STARTTIME
IS NOT NULL ORDER BY VERSIONS_STARTTIME DESC;



 
      ID NAME   GENDE VERSIONS_STARTTIME    
   VERSIONS_ENDTIME          V



----------
------ ----- ------------------------- ------------------------- -



 
       6
史波   男    30-11月-11 04.02.28 下午                
           I



 
       5
孙书祯 男    30-11月-11 04.02.28 下午                
           I



 
       1
宋春风 男    30-11月-11 04.02.28 下午                
           I



 
       3
白冰   男    30-11月-11 04.02.28 下午                
           I



 
       2
叶民   男    30-11月-11 04.02.28 下午                
           I



 
       4
方巍森 男    30-11月-11 04.02.28 下午                
           I



已选择6行。



修改几条数据和接下来的查询做对比。









SQL>
UPDATE TEST SET GENDER='
女' WHERE NAME='孙书祯';     
已更新 1 行。



SQL>
COMMIT;      
提交完成。



SQL>
UPDATE TEST SET GENDER='
女' WHERE NAME='史波';        
已更新 1 行。



SQL>
COMMIT;                    
                     
                     
        
提交完成。



再次查询,被修改的数据就可以看到被修改和修改前的数据。



SQL>
SELECT ID,NAME,GENDER,VERSIONS_STARTTIME,VERSIONS_ENDTIME,



VERSIONS_OPERATION
FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND 



MAXVALUE
WHERE VERSIONS_STARTTIME IS NOT NULL ORDER BY 



VERSIONS_STARTTIME
DESC;



 
      ID NAME   GENDE VERSIONS_STARTTIME    
   VERSIONS_ENDTIME          V



----------
------ ----- ------------------------- ------------------------- -



 
       6
史波   女    30-11月-11 04.15.07 下午                
           U



 
       5
孙书祯 女    30-11月-11 04.14.31 下午                
           U



 
       4
方巍森 男    30-11月-11 04.02.28 下午                
           I



 
       3
白冰   男    30-11月-11 04.02.28 下午                
           I



 
       2
叶民   男    30-11月-11 04.02.28 下午                
           I



 
       1
宋春风 男    30-11月-11 04.02.28 下午                
           I



 
       6
史波   男    30-11月-11 04.02.28 下午  30-11月-11 04.15.07 下午  I



 
       5
孙书祯 男    30-11月-11 04.02.28 下午  30-11月-11 04.14.31 下午  I



已选择8行。   



再修改几条数据后后查询。



SQL>
delete from test WHERE NAME='
史波';            
已删除 1 行。



SQL>
delete from test WHERE NAME='
孙书祯';         
已删除 1 行。



SQL>
commit;                    
                     
           
提交完成。



SQL>
SELECT ID,NAME,GENDER,VERSIONS_STARTTIME,VERSIONS_ENDTIME,



VERSIONS_OPERATION
FROM TEST VERSIONS BETWEEN TIMESTAMP MINVALUE AND 



MAXVALUE
WHERE VERSIONS_STARTTIME IS NOT NULL ORDER BY 



VERSIONS_STARTTIME
DESC;



 
      ID NAME   GENDE VERSIONS_STARTTIME    
   VERSIONS_ENDTIME          V



----------
------ ----- ------------------------- ------------------------- -



 
       5
孙书祯 男    30-11月-11 04.26.02 下午                
           D



 
       6
史波   男    30-11月-11 04.26.02 下午                
           D



 
       6
史波   女    30-11月-11 04.15.07 下午  30-11月-11 04.19.08 下午  U



 
       5
孙书祯 女    30-11月-11 04.14.31 下午  30-11月-11 04.19.08 下午  U



 
       2
叶民   男    30-11月-11 04.02.28 下午                
           I



 
       3
白冰   男    30-11月-11 04.02.28 下午                
           I



 
       4
方巍森 男    30-11月-11 04.02.28 下午                
           I



 
       5
孙书祯 男    30-11月-11 04.02.28 下午  30-11月-11 04.14.31 下午  I



 
       1
宋春风 男    30-11月-11 04.02.28 下午                
           I



 
       6
史波   男    30-11月-11 04.02.28 下午  30-11月-11 04.15.07 下午  I



已选择10行。



通过以上小实验可以看出,VERSIONS_STARTTIME是数据被修改的起始时间,VERSIONS_ENDTIME是数据被修改后新数据的有效时间,也就是VERSIONS_STARTTIME和VERSIONS_ENDTIME时间段内,这条数据再没被修改过,如果VERSIONS_ENDTIME为空,就说明这天记录从VERSIONS_STARTTIME时间起再没被修改过。VERSIONS_OPERATION是修改状态,I代表INSERT,U代表UPDATE,D代表DELETE。此时如果想回滚INSERT的数据,只需要DELETE反向操作即可,如果想回滚UPDATE操作,将数据反向UPDATE回去即可,比如本实验已经可以看到进行UPDATE操作的是NAME为史波和孙书祯的两条记录,而且也可以看到进行UPDATE之前的数据他们的性别是男,所以只需要在做个反向UPDATE,将性别该为男即可实现回退,如果要回滚DELETE操作,同样做个INSERT操作,将删除的数据在插回去即可。



注:此SQL只能查询到回滚段内的信息,超出回滚段范围这个SQL就无能为力了,需要借助LOGMGR工具挖掘日志了









补充资料:





 


 

查系统表和指定scn的用法


 

select * from v$transaction as of scn
  2388210;


 

select
  dbms_flashback.get_system_change_number,t.CURRENT_SCN from v$database t;


 


 

select * from v$transaction as of
  timestamp  (systimestamp - interval '1' minute)  --
查询系统表要选connection as
  sysDba
,不然报"权限不足"


 






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

请登录后发表评论 登录
全部评论

注册时间:2015-01-19

  • 博文量
    126
  • 访问量
    1054944