发布时间 : 星期日 文章Oracle 10 闪回功能实例讲解更新完毕开始阅读7281d666783e0912a2162aaf
3.使用Version Query(闪回版本查询)
--通过使用versions关键字来获得版本信息
flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startsc 2 versions_endscn v_edcn,versions_operation v_ops
3 from tb1 versions between scn minvalue and maxvalue where empno=1
n v_stcn,
000;
EMPNO ENAME JOB XID V_STCN V_EDCN V_OPS ----- -------- --------- ---------------- ---------- ---------- ----- 1000 Jack President 0A000C007E010000 1124320 I 1000 Jack Manager 09000C00EE010000 1124301 D 1000 Jack Manager 0A0009007E010000 1124282 1124301 U 1000 Jack Clerk 06000E00A9010000 1124245 1124282 I
0;
上面的示例通过为表tb1中插入一条empno=1000记录,并更新其职务,接下来对该记同的记录,可以看出对empno=1000所作的不同的修改被全部记录下来。
录进行删除,最后再次添加empno=1000,且职务不
注意,一个事务中,如果多次对该记录进行了修改,则查询中仅仅显示最后一次提交
字来查询对该表中的某条特定记录修改的不同版本
的状态,我们可以通过使用versions between关键
查看不同的版本使用了类似于rowid的伪列
versions_xid --记录指定版本的事务的唯一标识符 versions_startscn --记录的起始SCN号 versions_endscn --记录的终止SCN号
versions_operation --记录的操作类型(DML操作,I表示插入,U表示更新,versions_starttime --记录被修改的起始时间 versions_endtime --记录被修改的终止时间
D表示删除)
--也可以修改查询的条件来获取更多不同的版本,如下查询则为查询该记录一个小时
flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startsc 2 versions_endscn v_edcn,versions_operation v_ops 3 from tb1 versions between timestamp
4 to_timestamp(systimestamp-1/24) and systimestamp where empno=100
以内的不同版本 n v_stcn,
二、Flashback Transaction Query(闪回事务查询)
闪回事务查询是对闪回版本查询的扩展。从某种程度上来说,闪回版本查询通常用于更细粒度的查询,如针对特定的记录。而闪回事务则是
针对某一事务进行闪回,是基于事务级别的。闪回事务查询通过查询视图flashback_tran同时可以根据该视图中提供的undo_sql 列中的语句来反转事务,从而保证数据的完整性。 查询该视图需要具有select any transaction权限,默认情况下sys用户和DBA角色具有
saction_query来获得某个或多个特定事务信息,
该权限
下面演示基于事务的闪回示例
flasher@ORCL> create table tb2 tablespace users as select empno,ename,
sal,deptno from scott.emp; --创建表tb2
flasher@ORCL> insert into tb2 select 9999,'Robinson',3000,50 from dua
l; --插入新记记录
flasher@ORCL> commit
--提交事务一
flasher@ORCL> select * from tb2 where empno=9999;
EMPNO ENAME SAL DEPTNO ----- -------- --------- ------ 9999 Robinson 3000.00 50
flasher@ORCL> update tb2 set sal=sal+500 where empno=9999;
flasher@ORCL> commit;
flasher@ORCL> update tb2 set deptno=20 where empno=9999;
flasher@ORCL> commit;
flasher@ORCL> select empno,ename,sal,deptno,versions_xid,versions_oper 2 from tb2 versions between scn minvalue and maxvalue --使用 3 where empno=9999;
EMPNO ENAME SAL DEPTNO VERSIONS_XID V 9999 Robinson 3500 20 08000400C9010000 U
--更新记录
--提交事务二
--再次更新记录
--提交事务三
ation
Version Query查询从中看到了三个事务
---------- ---------- ---------- ---------- ---------------- -
ry ry
9999 Robinson 3500 50 09001600BE010000 U 9999 Robinson 3000 50 04002C00CA010000 I --
I为最早的事务
flasher@ORCL> select operation,undo_sql from flashback_transaction_que 2 where xid=hextoraw('09001600BE010000'); --根据事务号获得一
OPERATION UNDO_SQL
---------- -----------------------------------------------------------UPDATE update \.\set \= '3000' where ROWID = 'AA
个反转该事务的DML语句
--------------------- ANUPAAGAAAAAkAAN';
flasher@ORCL> select operation,undo_sql from flashback_transaction_que 2 where xid=hextoraw('08000400C9010000'); --根据事务号获得一
OPERATION UNDO_SQL
---------- -----------------------------------------------------------UPDATE update \.\set \= '50' where ROWID = 'A
个反转该事务的DML语句
--------------------- AANUPAAGAAAAAkAAN';
从上面的两个查询中可以得到反转事务的DML语句,直接执行相应的反转语句,即可是执行了回滚操作。
将事务变更到特定的状态,有点类似于回滚,但不
三、总结
1.Flashback Version 多用于查看某条特定记录所有已提交的版本,包括每个版本的创建2.Flashback Transaction Query 多用于查看某个事务内的特定对象,可以通过视图flas3.闪回中不能对DDL语句进行闪回,即闪回仅仅支持DML语句 时间以及结束时间。
hback_transaction_query构造倒退事务的DML语句。