Oracle 闪回特性 Flashback Query Flashback Table

本文介绍了Oracle的闪回特性,包括Flashback Query和Flashback Table,这两种特性有助于在不丢失数据的情况下进行数据恢复。通过示例详细展示了如何使用AS OF SCN和AS OF TIMESTAMP来执行闪回查询,以及如何执行表闪回操作,强调了这些操作对于数据完整性的重要性。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

--==================================================

-- Oracle 闪回特性(Flashback QueryFlashback Table)

--==================================================

 

    Oracle 闪回查询是指针对特定的表来查询特定的时间段内的数据变化情况来确定是否将表闪回到某一个特定的时刻以保证数据无讹误存在。

这个特性大大的减少了采用时点恢复所需的工作量以及数据库脱机的时间。  闪回查询通常分为Flashback Query(闪回查询)

Flashback Table Query(闪回表查询)Flashback Version Query(闪回版本查询)Flashback Transaction Query(闪回事务查询)。本文主要讲

Flashback Query(闪回查询)Flashback Table Query(闪回表查询)。其余闪回请参考后续文章。

 

一、Flashback Query(闪回查询)

    通常用于检索一条记录的所有版本,倒退单独的事务或者倒退从指定时间以来对特定表的所有变化

    Flashback Query的所有形式取决于UNDO表表空间,关于UDNO表空间请参考:Oracle 回滚(ROLLBACK)和撤销(UNDO)

   

    1.闪回查询(Flashback Query)语法

           

        SELECT <column_name_list>

        FROM <table_name>

        AS OF <SCN>                            --使用as of scn

        [WHERE <filter_conditions>]

        [GROUP BY <unaggregated columns>]

        [HAVING <group_filter>]

        [ORDER BY <column_positions_or_name>]

   

        SELECT <column_name_list>

        FROM <table_name>

        AS OF <TIMESTAMP>                      --使用as of timestamp

        [WHERE <filter_conditions>]

        [GROUP BY <unaggregated columns>]

        [HAVING <group_filter>]

        [ORDER BY <column_positions_or_name>]

   

    2.演示闪回查询

        a.演示使用as of timestamp来进行闪回查询

            flasher@ORCL11G> create table tb1 as

              2  select empno,ename,job,deptno from scott.emp where 1=0;

 

            flasher@ORCL11G> insert into tb1

              2  select empno,ename,job,deptno

              3  from scott.emp where empno in(7369,7499,7521,7566);

 

            flasher@ORCL11G> commit;

     

            flasher@ORCL11G> select * from tb1;

 

                 EMPNO ENAME      JOB           DEPTNO

            ---------- ---------- --------- ----------

                  7369 SMITH      CLERK             20

                  7499 ALLEN      SALESMAN          30

                  7521 WARD       SALESMAN          30

                  7566 JONES      MANAGER           20 

 

            flasher@ORCL11G> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

 

            TO_CHAR(SYSDATE,'YY'

            -------------------

            2010-10-25 17:26:08

 

            flasher@ORCL11G> delete from tb1 where job='SALESMAN';

 

            flasher@ORCL11G> commit;

 

            flasher@ORCL11G> select * from tb1;

 

                 EMPNO ENAME      JOB           DEPTNO

            ---------- ---------- --------- ----------

                  7369 SMITH      CLERK             20

                  7566 JONES      MANAGER           20   

         

            flasher@ORCL11G> select * from tb1 as of timestamp

              2  to_timestamp('2010-10-25 17:26:08','yyyy-mm-dd hh24:mi:ss');

 

                 EMPNO ENAME      JOB           DEPTNO

            ---------- ---------- --------- ----------

                  7369 SMITH      CLERK             20

                  7499 ALLEN      SALESMAN          30

                  7521 WARD       SALESMAN          30

                  7566 JONES      MANAGER           20   

 

            flasher@ORCL11G> select * from tb1 as of timestamp

              2  to_timestamp('2010-10-25 17:26:08','yyyy-mm-dd hh24:mi:ss')

              3  minus select * from tb1;

 

                 EMPNO ENAME      JOB           DEPTNO

            ---------- ---------- --------- ----------

                  7499 ALLEN      SALESMAN          30

                  7521 WARD       SALESMAN          30

        b.演示使用as of scn来进行闪回查询

            flasher@ORCL11G> select current_scn from v$database;

 

            CURRENT_SCN

            -----------

                2032782

 

            flasher@ORCL11G> select * from tb1;

 

                 EMPNO ENAME      JOB           DEPTNO

            ---------- ---------- --------- ----------

                  7369 Henry      CLERK             20

                  7566 JONES      MANAGER           20

 

            flasher@ORCL11G> delete from tb1 where empno=7369;

 

            flasher@ORCL11G> commit;

 

            flasher@ORCL11G> select * from tb1 as of scn 2032782;

 

                 EMPNO ENAME      JOB           DEPTNO

            ---------- ---------- --------- ----------

                  7369 Henry      CLERK             20

                  7566 JONES      MANAGER           20     

           

        由以上可知,通过闪回查询获得所需的记录信息,然后来构造新的DML语句并实施其操作来保证数据的完整性。

   

二、Flashback Table Query(闪回表查询)

    通过查询UNDO段来抽取所有已变化的记录细节,在此基础之上再构造和执行能够倒退这些变化的语句

    表闪回通过执行倒退变化的语句并且该执行是一个事务,所有常用规则在该事务上起作用。

    表闪回时,表上的触发器缺省被禁用,即该表上的DML触发器将暂时失效,可以在闪回时指定触发器是否失效。

    表闪回需要启用表上的记录转移选项

   

    1.下面给出表闪回的种方式

        FLASHBACK TABLE <schema_name.table_name>

        TO SCN <scn_number>            --基于SCN的表闪回

        [<ENABLE | DISABLE> TRIGGERS]

   

        FLASHBACK TABLE <schema_name.table_name>

        TO TIMESTAMP <timestamp>       --基于TIMESTAMP的表闪回

        [<ENABLE | DISABLE> TRIGGERS]

 

        FLASHBACK TABLE <schema_name.table_name>

        TO RESTORE POINT <restore_point>   --基于RESTORE POINT的表闪回

        [<ENABLE | DISABLE> TRIGGERS]

   

    2.演示基于SCN的表闪回

        下面的演示首先创建表tb_tables,并对表分几次插入数据,在完成插入前记录其SCN号用于后续对其进行闪回

       

            create table tb_emp as          --创建演示表tb_emp

            select empno,ename,job,deptno from scott.emp where 1=0;

 

            select table_name,row_movement from user_tables; --查看表的row movement行为,缺省为disable

 

            TABLE_NAME                     ROW_MOVE

            ------------------------------ --------

            TB_EMP                         DISABLED

       

            select current_scn,systimestamp from v$database;  --获取系统当前的SCN

            CURRENT_SCN SYSTIMESTAMP

            ----------- --------------------------------------

                 661490 01-JAN-11 10.56.28.733000 PM +08:00

 

            insert into tb_emp         --插入deptno10的员工

            select empno,ename,job,deptno from scott.emp where deptno=10;

            commit;

 

            select current_scn,systimestamp from v$database;  --获取系统当前的SCN

            CURRENT_SCN SYSTIMESTAMP

            ----------- --------------------------------------

                661510  01-JAN-11 10.56.56.546000 PM +08:00

 

            insert into tb_emp        --插入deptno20的员工

            select empno,ename,job,deptno from scott.emp where deptno=20;

            commit;

 

            select current_scn,systimestamp from v$database;  --获取系统当前的SCN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值