先举例说明下10g中的flashbak
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 – Production
SQL> create table sunwg (id number);
表已创建。
SQL> insert into sunwg values (1);
已创建 1 行。
SQL> insert into sunwg values (2);
已创建 1 行。
SQL> insert into sunwg values (3);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
20080310 11:26:20
SQL> delete from sunwg where id = 2;
已删除 1 行。
SQL> commit;
提交完成。
SQL> select * from sunwg;
ID
--------------------
1
3
SQL> select * from sunwg as of timestamp to_date('20080310 11:26:20','yyyymmdd hh24:mi:ss');
ID
------------------
1
2
3
通过flashback我们能很容易的找到被删掉的ID = 2的记录。但是,有的时候仅仅找到丢失的数据还远远不够,我们还希望知道在这两个时间点的变化情况。在9i中,这是很难实现的,除非做时时的检测。在10g中,则要简单的多。
SQL> update sunwg set id = 4 where id =3;
已更新 1 行。
SQL> commit;
提交完成。
SQL> select * from sunwg;
ID
----------------
1
4
现在我们通过10g新提供的闪回版本查询来找到在两个时间点之前表sunwg到底发生了什么事情。
SQL> select versions_starttime,versions_endtime,versions_operation, id
2 from sunwg
3 versions between timestamp minvalue and maxvalue
4 order by VERSIONS_STARTTIME;
VERSIONS_STARTTIME VERSIONS_ENDTIME V ID
-------------------- -------------------- -------- - ----------
10-3月 -08 11.25.44 10-3月 -08 11.31.24 I 3
10-3月 -08 11.25.44 10-3月 -08 11.26.38 I 2
10-3月 -08 11.25.44 I 1
10-3月 -08 11.26.38 D 2
10-3月 -08 11.31.24 U 4
上面这个查询就是10g新提供的闪回版本查询特性。从这个结果我们能看到ID = 3的记录是在11:25:44秒插入到数据的,然后是在11:31:24秒生命终止了,我们知道在这个时刻ID = 3的被更新为ID = 4的记录了。我们看ID = 4这条记录也可以看得出来,这条记录是在11:31:24的时候被更新了。
做过数据仓库的人应该很清楚这就是最基础的记历史的格式,在数据仓库中为了记录历史信息,所以每条记录都会自己的生命周期信息,一般得到这样的信息需要进行大量的查询和比对工作。但是利用10g的新特性,我们能很轻易的查询到这样的信息。
在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列,与 ROWNUM、LEVEL 等其他熟悉的伪列相类似。其他伪列 — 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN — 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。有关该事务的更多详细信息可在视图 FLASHBACK_TRANSACTION_QUERY 中找到,其中列 XID 显示事务 id。例如,通过查询FLASHBACK_TRANSACTION_QUERY中VERSIONS_XID 值等于 000A000D00000029的记录,我们可以得到实际的语句UNDO_SQL。
最大的可用版本依赖于 UNDO_RETENTION。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8394333/viewspace-1000668/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8394333/viewspace-1000668/