暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORACLE闪回之闪回查询

IT界数据库架构师的漂泊人生 2020-12-14
1061

闪回查询这玩意还挺好用的

flashback database (闪回数据库)

Flashback Table (闪回表)

Flashback Drop (闪回删除)

Flashback Query(闪回查询)

  4.1 Flashback Query(闪回表查询)

  4.2 Flashback Version Query(闪回版本查询)

  4.3 Flashback Transaction Query(闪回事务查询)

这里做下目录更新,闪回表查询和闪回表是一个意思!

一、Flashback Query(闪回查询)

    通常用于检索一条记录的所有版本,倒退单独的事务或者倒退从指定时间以来对特定表的所有变化,Flashback Query的所有形式取决于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>]


select * from tb1 as of timestamp to_timestamp('2010-10-25 17:26:08','yyyy-mm-dd hh24:mi:ss');

select * from tb1 as of scn 2032782;

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

二、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 使用Version Query(闪回版本查询)

   --通过使用versions关键字来获得版本信息

   select empno,ename,job,versions_xid xid,versions_startscn v_stcn,

          versions_endscn v_edcn,versions_operation v_ops

    from tb1 versions between scn minvalue and maxvalue where empno=1000; 

通过为表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      --记录被修改的终止时间

--可以修改查询的条件来获取更多不同的版本,如下查询则为查询该记录一个小时以内的不同版本

select empno,ename,job,versions_xid xid,versions_startscn v_stcn,

versions_endscn v_edcn,versions_operation v_ops

from tb1 versions between timestamp

to_timestamp(systimestamp-1/24) and systimestamp where empno=1000;


三、Flashback Transaction Query(闪回事务查询)

    闪回事务查询是对闪回版本查询的扩展。从某种程度上来说,闪回版本查询通常用于更细粒度的查询,如针对特定的记录。而闪回事务则是针对某一事务进行闪回,是基于事务级别的。闪回事务查询通过查询视图flashback_transaction_query来获得某个或多个特定事务信息,

同时可以根据该视图中提供的undo_sql列中的语句来反转事务,从而保证数据的完整性。

查询该视图需要具有select any transaction权限,默认情况下sys用户和DBA角色具有该权限

select empno,ename,sal,deptno,versions_xid,versions_operation

from tb2 versions between scn minvalue and maxvalue  --用Version Query查到三个事务

where empno=9999;

 

EMPNO  ENAME SAL     DEPTNO VERSIONS_XID     V

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

9999  Shark  3500  20 08000400C9010000 U

9999  Shark  3500  50 09001600BE010000 U

9999  Shark  3000  50 04002C00CA010000 I     -- I为最早的事务

 

select operation,undo_sql from flashback_transaction_query

 where xid=hextoraw('09001600BE010000');        --根据事务号获得一个反转该事务的DML语句

             

 OPERATION  UNDO_SQL

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

 UPDATE     update "FLASHER"."TB2" set "SAL" = '3000' where ROWID = 'AAANUPAAGAAAAAkAAN';

 

select operation,undo_sql from flashback_transaction_query

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语句。


四 总结

1 闪回技术分四种 A 闪回数据库; B 闪回表;C 闪回删除;D 闪回查询

2 闪回数据库需要共享恢复目录

3 闪回表和闪回删除受限于表空间剩余量

4 闪回各种查询,受限于UNDO表空间.

 




文章转载自IT界数据库架构师的漂泊人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论