oracle闪回版本和闪回事务查询详解(三)

2014-11-24 09:08:57 · 作者: · 浏览: 3
R@ORCL>select * from fb_query2;


DEPTNO DNAME LOC
---------- -------------- -------------
10 NEW YORK
20 DALLAS
30 CHICAGO
40 BOSTON


11:06:37 TYGER@ORCL>update fb_query1 set dname='' where deptno=10;


1 row updated.


11:07:10 TYGER@ORCL>select * from fb_query1;


DEPTNO DNAME LOC
---------- -------------- -------------
10
20 RESEARCH
30 SALES
40 OPERATIONS


// sys 用户不允许使用dbms_flashback 包
11:07:20 TYGER@ORCL>conn / as sysdba
Connected.
11:07:35 SYS@ORCL>set time off
SYS@ORCL>exec dbms_flashback.enable_at_time(sysdate-5/1440);
BEGIN dbms_flashback.enable_at_time(sysdate-5/1440); END;


*
ERROR at line 1:
ORA-08185: Flashback not supported for user SYS
ORA-06512: at "SYS.DBMS_FLASHBACK", line 3
ORA-06512: at line 1

实验二:闪回版本

---通过闪回版本可审计表行,检索影响行的事务处理的有关信息。然后可使用返回的事务处理标识符来执行事务处理挖掘(通过使用LogMiner)或执行闪回版本查询。

所谓版本(version)指的是每次事务所引起的数据行的变化情况,每次变化就是一个版本,oracle提供了闪回版本查询,从而可以让让我们很清楚地看到数据行的整个变化过程,这里的变化都是已经提交了的事务引起的变化,没有提交的事务引起的变化不会显示,闪回版本查询利用的是undo表空间里记录的undo数据。

使用伪列 获取一段时间内的版本

伪列:versions_starttime、versions_endtime、versions_startscn、versions_endscn、versions_xid、versions_operation、

versions_startscn versions_starttime

操作时的SCN和时间 如果为空 表示该行在查询范围之外创建

versions_endscn versions_endtime

失效时的SCN和时间 如果为空 表示该行被删除或在查询范围内无改动

versions_xid

事务ID

versions_operation

该行被执行的操作 I(insert) D(delete) U(update)

minvalue maxvalue

版本的最大时间值和最小时间值

注意事项:

versions子句不能用于查询以下特殊表:

· 外部表

· 临时表

· 固定表(x$开头的表,也就是oracle内部的表,用于数据字典的基表),下面sql语句可查询相关表

select * from v$fixed_table

不能使用versions子句查询视图。但是,在视图定义中可使用versions子句。

· versions子句不能跨DDL命令使用

· 过滤掉段收缩操作过的行

实验:闪回版本查询

TYGER@ORCL>create table tyger as select ename,job,sal from scott.emp where rownum<5;


Table created.


TYGER@ORCL>select * from tyger;


ENAME JOB SAL
---------- --------- ----------
SMITH CLERK 857
ALLEN SALESMAN 1656
WARD SALESMAN 1306
JONES MANAGER 3031


TYGER@ORCL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';


Session altered.


TYGER@ORCL>select sysdate from dual;


SYSDATE
-------------------
2014-03-14 14:41:46


TYGER@ORCL>update tyger set sal=sal+100 where ename='SMITH';


1 row updated.


TYGER@ORCL>commit;


Commit complete.


TYGER@ORCL>update tyger set sal=sal+100 where ename='SMITH';


1 row updated.


TYGER@ORCL>commit;


Commit complete.


TYGER@ORCL>update tyger set sal=sal+100 where ename='SMITH';


1 row updated.


TYGER@ORCL>commit;


Commit complete.


TYGER@ORCL>select * from tyger;


ENAME JOB SAL
---------- --------- ----------
SMITH CLERK 1157
ALLEN SALESMAN 1656
WARD SALESMAN 1306
JONES MANAGER 3031

TYGER@ORCL>col starttime for a30
TYGER@ORCL>l
1 select to_char(versions_starttime,'yyyy-mm-dd hh24:mi:ss') as starttime,
2 versions_xid,ename,job,sal
3 from tyger versions between timestamp to_date('2014-03-14 14:41:46','yyyy-mm-dd hh24:mi:ss')
4* and sysdate where ename='SMITH'
TYGER@ORCL>/


STARTTIME VERSIONS_XID ENAME JOB SAL
------------------------------ ---------------- ---------- --------- ----------
2014-03-14 14:42:32 080016000F020000 SMITH CLERK 1157
2014-03-14 14:42:26 01002C00F1010000 SMITH CLERK 1057
2014-03-14 14:42:17 0600180025020000 SMITH CLERK 957
SMITH CLERK 857

或者

TYGER@ORCL>col versions_starttime for a22
TYGER@ORCL>col versions_endtime for a22
TYGER@ORCL>l
1 select versions_starttime,versions_endtime,versions_xid,versions_operation,ename
2* from tyger versions between timestamp to_timestamp('2014-03-14 14:41:46','yyy