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