--==========================================================
-- Oracle 闪回特性(Flashback Version、Flashback Transaction)
--==========================================================
Oracle闪回特性为数据的快速回复某一对象的特定数据提供了更多的便利。前面介绍了闪回的几种特性,包括flashback database,
flashback drop ,flashback query ,flashback table 。接下来本文将介绍Flashback Version与Flashback Transaction。
一、Flashback Version Query(闪回版本查询)
闪回版本查询指的是Oracle可以针对特定的对象来查询某一特定段内该对象的变化的所有情况,可以对此跟踪该对象的变更情况。也可以根
据特定的需要来将该对象修正到特定的时刻。闪回版本查询同闪回查询,闪回表一样,同样是使用了UNDO段的数据,即数据变更的多次镜像
,当UNDO段的数据由于空间压力而被清除,则产生无法闪回的情况。
1.闪回版本查询语法,使用VERSIONS BETWEEN 关键字
SELECT
FROM
VERSIONS BETWEEN SCN AND --基于SCN的版本查询
[WHERE ]
[GROUP BY ]
[HAVING
[ORDER BY ]
SELECT
FROM
VERSIONS BETWEEN timestamp to_timestamp('start_timestamp') and to_timestamp('end_timestamp') --基于TIMESTAMP的版本查询
[WHERE ]
[GROUP BY ]
[HAVING
[ORDER BY ]
2.创建演示环境
--对表tb1作如下操作,插入empno为的记录后,更新其职务,然后再删除该记录,最后再次插入该记录
flasher@ORCL>create table tb1 tablespace users as select empno,ename,job,deptno from scott.emp; --创建表tb1
flasher@ORCL> insert into tb1 values(1000,'Jack','Clerk',20); --插入记录
flasher@ORCL> commit; --提交事务
flasher@ORCL> update tb1 set job='Manager' where empno=1000; --将职务更新为Manager
flasher@ORCL> commit; --提交事务
flasher@ORCL> delete from tb1 where empno=1000; --删除该记录
flasher@ORCL> commit; --提交事务
flasher@ORCL> insert into tb1 values(1000,'Jack','President',20); --重新插入该记录
flasher@ORCL> commit; --提交事务
3.使用Version Query(闪回版本查询)
--通过使用versions关键字来获得版本信息
flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,
2 versions_endscn v_edcn,versions_operation v_ops
3 from tb1 versions between scn minvalue and maxvalue where empno=1000;
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
上面的示例通过为表tb1中插入一条empno=1000记录,并更新其职务,接下来对该记录进行删除,最后再次添加empno=1000,且职务不
同的记录,可以看出对empno=1000所作的不同的修改被全部记录下来。
注意,一个事务中,如果多次对该记录进行了修改,则查询中仅仅显示最后一次提交的状态,我们可以通过使用versions between关键
字来查询对该表中的某条特定记录修改的不同版本
查看不同的版本使用了类似于rowid的伪列
versions_xid --记录指定版本的事务的唯一标识符
versions_startscn --记录的起始SCN号
versions_endscn --记录的终止SCN号
versions_operation --记录的操作类型(DML操作,I表示插入,U表示更新,D表示删除)
versions_starttime --记录被修改的起始时间
versions_endtime --记录被修改的终止时间
--也可以修改查询的条件来获取更多不同的版本,如下查询则为查询该记录一个小时以内的不同版本
flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,
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=1000;