一、闪回版本查询(versions子句查询)
闪回版本查询表现的是数据表的一个时间段的所有快照变化记录,说起来比较简单,但是却不那么好理解,如果简单来说我们可以把数据表的每一个时间段都细化为一个快照形式也就是我们所说的版本,而这个版本在不停的变化因为有更新dml操作,而闪回版本查询就是记录时间段内每个版本的“生命周期”。
select versions_startscn startscn,versions_endscn endscn,versions_xid xid,versions_operation operation , id,name,desc1,desc2 from flashback_of
versions between scn minvalue and maxvalue where id in('02');
结果如下:
1 80340280 05000B00D5060000 U 02 name2 update upadte
2 80340226 80340280 07000000D1060000 U 02 name2 update2 upadte2
3 80340226 02 name2 desc12 desc22
查看一条记录的多个版本的声明周期。闪回版本查询各条记录都是记录的时间段的版本快照。
其中的versions_startscn表示的是版本的创建时间,versions_endscn表示的是版本的结束时间
ersions_operation表示的创建该版本的对应的dml类型,有update、insert和delete
而versions_xid表示的则是该版本对应的事务id,通过versions_xid可以对应闪回事务查询视图flashback_transaction_query的xid列查看对应的反向操作undo_sql
注释:从查询结果可以看出一个版本的结束scn就是另一个版本的startscn。当该版本被修改后endscn才有值,同时该值是下一个版本的startscn。这样就可以清晰的分析
出每条记录每个版本的变化情况,可以根据需要按照不同的版本要求恢复数据。
二、闪回事务查询
example:
1、创建表
----------------create table---------------
create table BISBNK.FLASHBACK_OF
(
ID VARCHAR2(5) not null,
NAME VARCHAR2(20),
DESC1 VARCHAR2(20),
DESC2 VARCHAR2(20)
)
alter table BISBNK.FLASHBACK_OF
add primary key (ID)
using index
tablespace BISWEB_DATA
2、修改数据
----------------update date-----------------
update FLASHBACK_OF set desc1='moon';
commit;
3、获得对应scn版本的事务条件码
-----------------get versions_xid------------
select versions_startscn startscn,versions_endscn endscn,versions_xid xid,versions_operation operation , id,name,desc1,desc2 from flashback_of
versions between scn minvalue and maxvalue
result:
1 80341695 05000300D6060000 U 04 grubby moon desc24
2 80341695 05000300D6060000 U 03 grubby moon upadte3
3 80341695 05000300D6060000 U 02 grubby moon upadte2
4 80341695 05000300D6060000 U 01 grubby moon update1
5 80341570 80341695 04001000DA060000 I 01 grubby update1 update1
从结果中可以看到desc1字段变为moon的记录共有四条对应的是versions_xid都为05000300D6060000 ,分析可知是同一个事务提交后改变了四条记录,获得事务 码05000300D6060000 。
4、查询flashback_transcation_query视图获得start_scn,即未提及事务时的系统scn码,此时的scn码是事务开始提交时的scn码,该scn码是该事务提交之前的距离原始数据最近的
系统的scn码,对应保留的数据是绝对完整的恢复之前最新的数据。
------------get startscn from flashback_transcation_query-----------
select start_scn,commit_scn,undo_sql from flashback_transaction_query where xid=hextoraw('05000300D6060000')
获得事务开始执行的scn码:
result:
1 80341570 80341695 update "BISBNK"."FLASHBACK_OF" set "DESC1" = 'desc14' where ROWID = 'AAANn0AAGAAAA+2AAD';
2 80341570 80341695 update "BISBNK"."FLASHBACK_OF" set "DESC1" = 'update3' where ROWID = 'AAANn0AAGAAAA+2AAC';
3 80341570 80341695 update "BISBNK"."FLASHBACK_OF" set "DESC1" = 'update2' where ROWID = 'AAANn0AAGAAAA+2AAB';
4 80341570 80341695 update "BISBNK"."FLASHBACK_OF" set "DESC1" = 'update1' where ROWID = 'AAANn0AAGAAAA+2AAA';
5、闪回表到事务未提交时的scn码状态。即撤销事务!
要执行该步操作必须首先将表的行移动功能开启:
alter table flashback_of enable row movement;
然后执行闪回表:
flashback table flashback_of to scn 80341570;
检查数据:
select * from flashback_of
flashback_of表确实闪回到了事务提交前的状态。即撤销了事务。
注:1、如果提交事务修改的数据记录数不是很多的话,可以不用flashback table的方式,可以直接根据flashback_transcation_query视图中对应到该事务码xid的 undo_sql语句,直接copy执行即可还原到原来的记录情况。但是如果是大数据量的情况下该方法的工作量就很大啦,较为适合的方法还是flashback table。
2、如果确切的知道dml操作提交的时间也可以使用如下的sql命令恢复到dml操作之前的状态
flashback table flashback_of to timestamp to_timestamp('2014-09-12 16:45:23','yyyy-mm-dd hh24:mi:ss');
尽量避免使用timestamp 闪回,在大型是数据库系统上很难知道dml操作的确切时间,可以使用往后多退些时间的方法,但是在生产系统上每多退几秒都有可能丢失大量 的数据。所以应该尽量使用scn号来闪回,避免使用timestamp 。
3、同样说明下闪回版本查询中不会记录没有提交的版本,而闪回事务查询中则会出现没有提交的事务,也就是commit_scn为空