您的位置:首页 > 数据库 > Oracle

Oracle 闪回特性(Flashback Version、Flashback Transaction)

2011-01-02 22:07 543 查看
--==========================================================
-- Oracle 闪回特性(Flashback Version、Flashback Transaction)
--==========================================================
   
    Oracle闪回特性为数据的快速回复某一对象的特定数据提供了更多的便利。前面介绍了闪回的几种特性,包括flashback database,
    flashback drop ,flashback query ,flashback table 。接下来本文将介绍Flashback Version与Flashback Transaction。
   
一、Flashback Version Query(闪回版本查询)
    闪回版本查询指的是Oracle可以针对特定的对象来查询某一特定段内该对象的变化的所有情况,可以对此跟踪该对象的变更情况。也可以根
    据特定的需要来将该对象修正到特定的时刻。闪回版本查询同闪回查询,闪回表一样,同样是使用了UNDO段的数据,即数据变更的多次镜像
    ,当UNDO段的数据由于空间压力而被清除,则产生无法闪回的情况。
   
    1.闪回版本查询语法,使用VERSIONS BETWEEN 关键字

        SELECT <columns>
        FROM <schema_name.table_name>
        VERSIONS BETWEEN SCN <minimum_scn> AND <maximum_scn>   --基于SCN的版本查询
        [WHERE <column_filter>]
        [GROUP BY <non-aggregated_columns>]
        [HAVING <group filter>
        [ORDER BY <position_numbers_or_column_names>]
       
        SELECT <columns>
        FROM <schema_name.table_name>
        VERSIONS BETWEEN timestamp to_timestamp('start_timestamp') and to_timestamp('end_timestamp') --基于TIMESTAMP的版本查询
        [WHERE <column_filter>]
        [GROUP BY <non-aggregated_columns>]
        [HAVING <group filter>
        [ORDER BY <position_numbers_or_column_names>]

       
    2.创建演示环境
 

        --对表tb1作如下操作,插入empno为的记录后,更新其职务,然后再删除该记录,最后再次插入该记录
            flasher@ORCL>create table tb1 tablespace users as select empno,ename,job,deptno from scott.emp; --创建表tb1
           
            flasher@ORCL> insert into tb1 values(1000,'Jack','Clerk',20);  --插入记录
 
            flasher@ORCL> commit;     --提交事务
 
            flasher@ORCL> update tb1 set job='Manager' where empno=1000;   --将职务更新为Manager
 
            flasher@ORCL> commit;     --提交事务
 
            flasher@ORCL> delete from tb1 where empno=1000;    --删除该记录
 
            flasher@ORCL> commit;    --提交事务
 
            flasher@ORCL> insert into tb1 values(1000,'Jack','President',20);  --重新插入该记录
 
            flasher@ORCL> commit;     --提交事务

   
    3.使用Version Query(闪回版本查询)

        --通过使用versions关键字来获得版本信息
            flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,
              2  versions_endscn v_edcn,versions_operation v_ops
              3  from tb1 versions between scn minvalue and maxvalue where empno=1000; 
 
            EMPNO ENAME    JOB       XID                  V_STCN     V_EDCN V_OPS
            ----- -------- --------- ---------------- ---------- ---------- -----
             1000 Jack     President 0A000C007E010000    1124320            I    
             1000 Jack     Manager   09000C00EE010000    1124301            D    
             1000 Jack     Manager   0A0009007E010000    1124282    1124301 U    
             1000 Jack     Clerk     06000E00A9010000    1124245    1124282 I    

  
        上面的示例通过为表tb1中插入一条empno=1000记录,并更新其职务,接下来对该记录进行删除,最后再次添加empno=1000,且职务不
        同的记录,可以看出对empno=1000所作的不同的修改被全部记录下来。
   
        注意,一个事务中,如果多次对该记录进行了修改,则查询中仅仅显示最后一次提交的状态,我们可以通过使用versions between关键
        字来查询对该表中的某条特定记录修改的不同版本
       
        查看不同的版本使用了类似于rowid的伪列
            versions_xid          --记录指定版本的事务的唯一标识符
            versions_startscn     --记录的起始SCN号
            versions_endscn       --记录的终止SCN号
            versions_operation    --记录的操作类型(DML操作,I表示插入,U表示更新,D表示删除)
            versions_starttime    --记录被修改的起始时间
            versions_endtime      --记录被修改的终止时间

   
        --也可以修改查询的条件来获取更多不同的版本,如下查询则为查询该记录一个小时以内的不同版本
            flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,
              2  versions_endscn v_edcn,versions_operation v_ops
              3  from tb1 versions between timestamp
              4  to_timestamp(systimestamp-1/24) and systimestamp where empno=1000;  

         
二、Flashback Transaction Query(闪回事务查询)
    闪回事务查询是对闪回版本查询的扩展。从某种程度上来说,闪回版本查询通常用于更细粒度的查询,如针对特定的记录。而闪回事务则是
    针对某一事务进行闪回,是基于事务级别的。闪回事务查询通过查询视图flashback_transaction_query来获得某个或多个特定事务信息,
    同时可以根据该视图中提供的undo_sql 列中的语句来反转事务,从而保证数据的完整性。
    查询该视图需要具有select any transaction权限,默认情况下sys用户和DBA角色具有该权限
       
        下面演示基于事务的闪回示例
       

            flasher@ORCL> create table tb2 tablespace users as select empno,ename,sal,deptno from scott.emp;  --创建表tb2
           
            flasher@ORCL> insert into tb2 select 9999,'Robinson',3000,50 from dual;  --插入新记记录
           
            flasher@ORCL> commit                                                   --提交事务一
 
            flasher@ORCL> select * from tb2 where empno=9999;
             
            EMPNO ENAME          SAL DEPTNO
            ----- -------- --------- ------
             9999 Robinson   3000.00     50
         
            flasher@ORCL> update tb2 set sal=sal+500 where empno=9999;             --更新记录
                     
            flasher@ORCL> commit;                                                  --提交事务二
             
            flasher@ORCL> update tb2 set deptno=20 where empno=9999;               --再次更新记录
             
            flasher@ORCL> commit;                                                  --提交事务三
             
            flasher@ORCL> select empno,ename,sal,deptno,versions_xid,versions_operation
              2  from tb2 versions between scn minvalue and maxvalue        --使用Version Query查询从中看到了三个事务
              3  where empno=9999;
 
                 EMPNO ENAME             SAL     DEPTNO VERSIONS_XID     V
            ---------- ---------- ---------- ---------- ---------------- -
                  9999 Robinson         3500         20 08000400C9010000 U
                  9999 Robinson         3500         50 09001600BE010000 U
                  9999 Robinson         3000         50 04002C00CA010000 I     -- I为最早的事务
 
            flasher@ORCL> select operation,undo_sql from flashback_transaction_query
              2  where xid=hextoraw('09001600BE010000');        --根据事务号获得一个反转该事务的DML语句
             
            OPERATION  UNDO_SQL
            ---------- --------------------------------------------------------------------------------
            UPDATE     update "FLASHER"."TB2" set "SAL" = '3000' where ROWID = 'AAANUPAAGAAAAAkAAN';
 
            flasher@ORCL> select operation,undo_sql from flashback_transaction_query
              2  where xid=hextoraw('08000400C9010000');        --根据事务号获得一个反转该事务的DML语句
             
            OPERATION  UNDO_SQL
            ---------- --------------------------------------------------------------------------------
            UPDATE     update "FLASHER"."TB2" set "DEPTNO" = '50' where ROWID = 'AAANUPAAGAAAAAkAAN';          

       
        从上面的两个查询中可以得到反转事务的DML语句,直接执行相应的反转语句,即可将事务变更到特定的状态,有点类似于回滚,但不
        是执行了回滚操作。
 
三、总结
    1.Flashback Version 多用于查看某条特定记录所有已提交的版本,包括每个版本的创建时间以及结束时间。
    2.Flashback Transaction Query 多用于查看某个事务内的特定对象,可以通过视图flashback_transaction_query构造倒退事务的DML语句。
    3.闪回中不能对DDL语句进行闪回,即闪回仅仅支持DML语句。
 
四、更多参考
    有关闪回特性请参考
        Oracle 闪回特性(FLASHBACK DATABASE)
Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN)
Oracle 闪回特性(Flashback Query、Flashback Table)
 
有关基于用户管理的备份和备份恢复的概念请参考:
        Oracle 冷备份
        Oracle 热备份
        Oracle 备份恢复概念
        Oracle 实例恢复
        Oracle 基于用户管理恢复的处理(详细描述了介质恢复及其处理)
       
    有关RMAN的恢复与管理请参考:
        RMAN 概述及其体系结构
        RMAN 配置、监控与管理
        RMAN 备份详解
        RMAN 还原与恢复
       
    有关Oracle体系结构请参考:
        Oracle 实例和Oracle数据库(Oracle体系结构)
        Oracle 表空间与数据文件
        Oracle 密码文件
        Oracle 参数文件
Oracle 数据库实例启动关闭过程
        Oracle 联机重做日志文件(ONLINE LOG FILE)
        Oracle 控制文件(CONTROLFILE)
        Oracle 归档日志
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: