ITPub博客

首页 > 数据库 > Oracle > 10g新特性——闪回版本查询

10g新特性——闪回版本查询

原创 Oracle 作者:sunwgneuqsoft 时间:2008-03-10 13:05:16 0 删除 编辑
由于粗心大意,在数据库中误操作数据的情况经常的发生。在9i之前,一般只能通过logminer或者时间点恢复来找回丢失的数据。在9i中出现了一种新的恢复技术——flashback,这样我们有了一种强有力的恢复工具,可以在不影响系统的情况下在最短的时间内找到丢失的数据。但是9i中的flashback还有很多的不足,使用起来并不是很方便。在10g中对flashback进行增强,使用简单明了,并且增加了对闪回版本查询的支持。[@more@]

先举例说明下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的记录是在112544秒插入到数据的,然后是在113124秒生命终止了,我们知道在这个时刻ID = 3的被更新为ID = 4的记录了。我们看ID = 4这条记录也可以看得出来,这条记录是在113124的时候被更新了。

做过数据仓库的人应该很清楚这就是最基础的记历史的格式,在数据仓库中为了记录历史信息,所以每条记录都会自己的生命周期信息,一般得到这样的信息需要进行大量的查询和比对工作。但是利用10g的新特性,我们能很轻易的查询到这样的信息。

在上述查询中,列 versions_starttimeversions_endtimeversions_xidversions_operation 是伪列,与 ROWNUMLEVEL 等其他熟悉的伪列相类似。其他伪列 VERSIONS_STARTSCN VERSIONS_ENDSCN — 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。有关该事务的更多详细信息可在视图 FLASHBACK_TRANSACTION_QUERY 中找到,其中列 XID 显示事务 id。例如,通过查询FLASHBACK_TRANSACTION_QUERYVERSIONS_XID 值等于 000A000D00000029的记录,我们可以得到实际的语句UNDO_SQL

最大的可用版本依赖于 UNDO_RETENTION

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8394333/viewspace-1000668/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    56
  • 访问量
    758670