ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Flashback Query

Flashback Query

原创 Linux操作系统 作者:cjy1026 时间:2010-05-11 14:59:55 0 删除 编辑

Flashback Query 是ORACLE 自9i 就开始提供的一项特性,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据(一般是提交后马上发现数据修改错误)。

查询方式:

在标准查询语句的表名后面跟上as of timestamp(基于时间)或as of scn(基于scn)。如下:

create table flashback_query_test
       as
       select '1' char_a,'2'char_b from dual
       union
       select '3' char_a,'4'char_b from dual

SQL>  select * from flashback_query_test;

CHAR_A CHAR_B
       ------ ------
       1      2
       3      4

----查询出scn 或者系统时间都行

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
       -----------
       58749133253

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

TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
       ------------------------------
       2010-03-23 15:22:46

--删除一条记录

delete from flashback_query_test
       where char_a='1'

SQL> select * from flashback_query_test;

CHAR_A CHAR_B
       ------ ------
       3      4

--查询删除之前的数据

SQL> select * from flashback_query_test as of scn 5875002343333;

CHAR_A CHAR_B
       ------ ------
       1      2
       3      4

----查询出scn 或者系统时间都行

SQL> SELECT CURRENT_SCN FROM V$DATABASE;

CURRENT_SCN
       -----------
       5875002343433

--更新一条记录

update flashback_query_test
       set char_a='5'

SQL> select * from flashback_query_test ;

CHAR_A CHAR_B
       ------ ------
       5      4

--查询更新前的数据

SQL> select * from flashback_query_test as of scn 5875002343433;

CHAR_A CHAR_B
       ------ ------
       3      4

 --TIMESTAMP的查询方式

SELECT * FROM FLASHBACK_QUERY_TEST AS OF TIMESTAMP sysdate-2/1440  --查询2分钟之前的数据

SELECT * FROM FLASHBACK_QUERY_TEST OF TIMESTAMP to_timestamp(' 2010-03-23 15:22:46','yyyy-mm-dd hh24:mi:ss')

当通过TIMESTAMP 来查询历史数据时,数据库会吧TIMESTAMP转换成SCN。

--查看SCN 和TIMESTAMP 的对应关系
       select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')
       from sys.smon_scn_time
       order by scn;

--查询对应表两个时间点做了哪些DML操作

Select versions_xid,
       versions_startscn,
       versions_endscn,
       DECODE(versions_operation,
              'I',
              'Insert',
              'U',
              'Update',
              'D',
              'Delete',
              'Original')"Operation"
  from table_name versions between scn 5874913219020  and 5874913219220 ;

前面说的只能查询一定时间呢的数据,那这个时间到底是多长呢?这和参数UNDO_RETENTION参数有关

show parameters undo_retention;   --单位为S;原则上这参数指定多长时间历史数据就保持多久,但UNDO表空间的大小也决定了历史数据的保存时间。如果UNDO表空间太小,之前的数据就会自动覆盖。(相反,表空间够大的话,超过指定时间,历史数据仍会存在,不会被覆盖)

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

下一篇: Oracle常用dump命令
请登录后发表评论 登录
全部评论

注册时间:2010-05-11

  • 博文量
    14
  • 访问量
    10430