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

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

-- 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 归档日志

 

 

时间: 2024-09-22 23:44:49

Oracle 闪回特性(Flashback Version、Flashback Transaction)的相关文章

Oracle 闪回特性(Flashback Query、Flashback Table)

--================================================== -- Oracle 闪回特性(Flashback Query.Flashback Table) --==================================================       Oracle 闪回查询是指针对特定的表来查询特定的时间段内的数据变化情况来确定是否将表闪回到某一个特定的时刻以保证数据无讹误存在. 这个特性大大的减少了采用时点恢复所需的工作量以及

Oracle 闪回特性(FLASHBACK DROP &amp;amp; RECYCLEBIN)

--============================================== -- Oracle 闪回特性(FLASHBACK DROP & RECYCLEBIN) --==============================================       FLASHBACK DROP 特性允许在不丢失任何数据库的情况下将指定的表恢复至其被删除的时间点,并保持数据库为当前状态.闪回删除并不是 真正的删除表,而是把该表重命名并放入回收站,类似于Windows的

Oracle 闪回特性(FLASHBACK DATABASE)

--===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --=====================================       闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回.表级别闪回.事务 级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询.闪回恢复将修改数据,闪回点之后的数据将全部丢失.而闪回查询则可 以查询数

Oracle闪回(flashback)功能详解 闪回数据归档(Flashback Data Archive)

Oracle闪回(flashback)功能详解  闪回数据归档(Flashback Data Archive)                     > > > > > > > >           > > >                               >                                           >                                 

用Oracle闪回功能恢复偶然丢失的数据

[导读]本文提出了闪回功能的原理,描述了利用Oracle 9i或Oracle 10g的闪回功能进行恢复偶然丢失数据的方法. 前言 人为的错误是数据库系统失败的重要原因之一,根据调查约40%的系统问题是操作失误或者用户错误引起的,这些人为的错误又特别难以避免.传统上当发生数据丢失.数据错误问题时,解决的主要方法就是数据的导入/导出.备份/恢复技术.这些方法都需要发生数据错误之前有一个正确的备份,才能进行恢复.恢复时不取决于错误程度,而只取决于备份/恢复策略.这种方法既耗时又使数据库系统不能提供服务

性能-关于Oracle闪回的问题

问题描述 关于Oracle闪回的问题 请问Oracle闪回的数据是否可以按照时间设置多少小时内可闪回? 还是Oracle闪回的数据只能设置数据量的大小? 另:Oracle闪回空间的设置对数据库性能有哪些方面的影响? 解决方案 Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复.闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行.事务.表和数据库范围.使用闪回特性,您可以查询以前的数据版本,还可以执行更改分析和自助式修复,以便在保持数据库联机的同时从逻

Oracle闪回原理测试(三)(r12笔记第16天)

 对于Oracle的闪回,很多朋友也问过问,到底是怎么玩的?如果自己做过一些闪回数据库的操作,就会发现这个功能非常强悍.   Flashback DML的操作其实还蛮容易理解的,但是Flashback DDDL那可就是另外一个level了,我们大概了解一下MySQL里面的闪回就会发现,真要实现无缝的全闪回,确实有很多的细节和场景需要考虑.而Oracle作为一个成熟的商业软件,是不希望我们了解很多底层的细节的,用着好就行,所以如果你想得到一些闪回更细节的东西,这个渠道就非常的窄,我们之前也测试了两

oracle闪回表详解

  --- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间内的各个版本 --- 使用闪回事务查询查看事务处理历史记录或行 优点: 闪回技术由于只能处理更改数据,所以从根本上改变了恢复技术.使用这个技术时,从错误中恢复花费的时间等于制造错误所花费的时间.当闪回技术使用时,它与介质恢复相比,在易用性.可用性和还原时间方面有明显的优势. 闪回数据库使用闪回日

Oracle 闪回技术详细介绍及总结_oracle

Oracle闪回技术详解,这里整理了4种闪回技术,对Oracle 闪回技术做一个整理总结.  概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速恢复逻辑错误,对于物理损坏或是介质丢失的错误,闪回技术就回天乏术了,还是得借助于Oracle一些高级的备份恢复工具如RAMN去完成(这才是Oracle强大备份恢复机制的精髓所在啊)  撤销段(UNDO SEG