日期:2014-05-16  浏览次数:20489 次

闪加查询、闪回版本查询、闪回事务查询

1.闪回查询:

步骤是记录当前SCN及时间,然后进行DML操作,提交后使用 timestamp和SCN进行对DML操作之前数据的查询

SQL> set time on;
19:13:57 SQL> insert into test select rownum from dual connect by rownum<=5;
5 rows inserted
19:14:47 SQL> commit;
Commit complete
19:14:49 SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1362061
19:18:11 SQL> delete  test where a>2;
3 rows deleted
19:18:17 SQL> commit;
Commit complete
19:21:56
SQL> select * from test as of timestamp to_timestamp('2013/06/23 19:17:00','yyyy/mm/dd hh24:mi:ss');
         A
----------
         2
         3
         4
         5
         1
19:24:23 SQL> select * from test as of scn 1362061;
         A
----------
         2
         3
         4
         5

         1

2.闪回查询--查询的是已经提交的数据

因为闪回查询的是已经提交的,这样即使数据未提交而数据库SHUTDOWN ABORT,重启后因为做实例恢复,使用闪回所查询的数据仍是已经提交的。

实验过程:查询当前SCN并执行DML操作不提交并查询当前SCN,使用闪回查询功能查询DML操作之前和之后的SCN

结果是:验证闪回查询返回的是已经提交的数据。

20:22:44 BYS@bys1>select * from test3;
        ID NAME
---------- ----------
         2 b
20:22:48 BYS@bys1>select current_scn from v$database;
CURRENT_SCN
-----------
    1741868
20:26:17 BYS@bys1>delete test3;   ---不提交
1 row deleted.

各种查询:

20:26:26 BYS@bys1>select * from test3;
no rows selected
20:26:29 BYS@bys1>select current_scn from v$database;
CURRENT_SCN
-----------
    1741881
20:26:50 BYS@bys1>select * from test3 as of scn 1741868;
        ID NAME
---------- ----------
         2 b
20:27:10 BYS@bys1>select * from test3 as of scn 1741881;
        ID NAME
---------- ----------
         2 b

3.闪回版本查询

versions_operation:    操作类型
versions_xid:    事务编号
versions_starttime:    开始时间
versions_endtime:    结束时间,如果有值,证明这记录已非当前记录
versions_startscn:    开始SCN号

versions_endscn:    结束SCN号 如果有值,证明这记录已非当前记录

操作步骤: