【闪回】查询

闪回查询可以依据时间或SCN两种方式进行闪回查询(select as of 语句或PL/SQL闪回查询)

一、闪回查询 as of 子句
语法:
SELECT FROM AS OF  

1)as of timestamp
SCOTT@ORA10G>set time on
14:57:59 SCOTT@ORA10G>create table fb_query as select * from dept;

Table created.

14:58:04 SCOTT@ORA10G>select * from fb_query;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

14:58:28 SCOTT@ORA10G>                                
14:59:50 SCOTT@ORA10G>delete fb_query where deptno=10;

1 row deleted.

14:59:55 SCOTT@ORA10G>commit;

Commit complete.

14:59:57 SCOTT@ORA10G>select * from fb_query;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

15:00:24 SCOTT@ORA10G>
--闪回查询1分钟以前
15:00:40 SCOTT@ORA10G>select * from fb_query as of timestamp sysdate - 1/1440;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

15:00:46 SCOTT@ORA10G>

2)as of SCN
SCOTT@ORA10G>conn / as sysdba
Connected.
SYS@ORA10G>grant execute on dbms_flashback to scott;

Grant succeeded.

SYS@ORA10G>conn scott/tiger
Connected.
SCOTT@ORA10G>select dbms_flashback.get_system_change_number as scn from dual;

       SCN
----------
    644478

SCOTT@ORA10G>select * from fb_query;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SCOTT@ORA10G>delete fb_query where deptno >=30; 

2 rows deleted.

SCOTT@ORA10G> commit;

Commit complete.

SCOTT@ORA10G>select * from fb_query;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS

SCOTT@ORA10G>select * from fb_query as of scn 644478;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SCOTT@ORA10G>


、利用PL/SQL包dbms_flashback
语法:
  • 会话启用闪回指定时间:
    DBMS_FLASHBACK.ENABLE_AT_TIME(query_time IN TIMESTAMP);
  • 会话启用闪回指定SCN:
    DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(query_scn IN NUMBER);
  • 关闭闪回:
    DBMS_FLASHBACK.DISABLE;

1)指定时间
SCOTT@ORA10G>set time on
15:15:20 SCOTT@ORA10G>create table fb_query1 as select * from dept;

Table created.

15:15:31 SCOTT@ORA10G>create table fb_query2 as select * from dept;

Table created.

15:15:35 SCOTT@ORA10G>
15:16:35 SCOTT@ORA10G>update fb_query1 set loc=null;

4 rows updated.

15:17:21 SCOTT@ORA10G>update fb_query2 set dname=null;

4 rows updated.

15:17:26 SCOTT@ORA10G>commit;

Commit complete.

15:17:32 SCOTT@ORA10G>select * from fb_query1;

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

15:17:38 SCOTT@ORA10G>select * from fb_query2;

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

15:17:42 SCOTT@ORA10G>
闪回定位到1分钟前;另,处于闪回会话模式时,不允许执行DML、DDL操作
注:包 dbms_flashback的执行权限,要单独赋予
15:17:43 SCOTT@ORA10G>exec dbms_flashback.enable_at_time(sysdate-1/1440);

PL/SQL procedure successfully completed.

15:18:06 SCOTT@ORA10G>select * from fb_query1;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

15:18:28 SCOTT@ORA10G>select * from fb_query2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

15:18:32 SCOTT@ORA10G>delete fb_query1;
delete fb_query1
       *
ERROR at line 1:
ORA-08182: operation not supported while in Flashback mode


15:18:40 SCOTT@ORA10G>exec dbms_flashback.disable;

PL/SQL procedure successfully completed.

15:18:56 SCOTT@ORA10G>select * from fb_query1;

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

15:19:03 SCOTT@ORA10G>select * from fb_query2;

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

15:19:07 SCOTT@ORA10G>

2)指定SCN
SCOTT@ORA10G>select dbms_flashback.get_system_change_number as scn from dual;

       SCN
----------
    645510

SCOTT@ORA10G>delete fb_query1;

4 rows deleted.

SCOTT@ORA10G>delete fb_query2;

4 rows deleted.

SCOTT@ORA10G>commit;

Commit complete.

SCOTT@ORA10G> exec dbms_flashback.enable_at_system_change_number(645510);

PL/SQL procedure successfully completed.

SCOTT@ORA10G>select * from fb_query1;

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

SCOTT@ORA10G>select * from fb_query2;

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

SCOTT@ORA10G>exec dbms_flashback.disable;

PL/SQL procedure successfully completed.

SCOTT@ORA10G>select count(*) from fb_query1;

  COUNT(*)
----------
         0

SCOTT@ORA10G>select count(*) from fb_query2;

  COUNT(*)
----------
         0

SCOTT@ORA10G>

三:小结
1)闪回查询也是依据UNDO数据来完成的,也就是说,能闪回查询多长时间的数据完全取决于undo_retention。
2)闪回查询可基于时间或SCN
3)闪回查询可以使用as of子句,也可使用PL/SQL包dbms_flashback

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

转载于:http://blog.itpub.net/685769/viewspace-749348/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值