oracle闪回版本查询学习

自己做了个实验,看看闪回版本查询是咋回事。

闪回版本的查询是基于undo表空间的。所以undo一定要够用够大,并且undo日志保存的时间最好也够长,否则查询时会报错:ORA-30052:下限快照表达式无效。这个时候要么修改查询的时间范围,要么把undo日志的保存时间设置大一些:alter system set undo_retention=1800 scope=both;

闪回版本查询语句可以用以下两种:

1) select versions_starttime, versions_endtime, versions_xid, versions_operation, t.* FROM  lxm.t  VERSIONS
BETWEEN TIMESTAMP TO_TIMESTAMP('2016-08-31 13:50:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2016-08-31 14:05:00', 'YYYY-MM-DD HH24:MI:SS');

或者

select versions_startscn, versions_endtime, versions_xid, versions_operation, t.* FROM  lxm.t  VERSIONS
BETWEEN TIMESTAMP TO_TIMESTAMP('2016-08-31 13:50:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2016-08-31 14:05:00', 'YYYY-MM-DD HH24:MI:SS');

2) select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query q where q.xid in (select versions_xid from lxm.t versions between
TIMESTAMP TO_TIMESTAMP('2016-08-31 13:50:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2016-08-31 14:05:00', 'YYYY-MM-DD HH24:MI:SS'));


第一种语句:

先看第一种语句的实验结果:

versions_xid 表示事务编号。我分别做了insert、update和delete的操作。主要是 update,如果versions_starttime 和 versions_endtime的值一样,那么这两条记录分别记录update前和update后的值,带U的那条记录就是update后的值,不带U的记录就是update前的值。

下面这个图表示做了两次update:

注:这里的scn号是系统的currernt_scn号,可以用以下语句查找:

                select current_scn from v$database;

       scn号可以和时间戳互相转换,语句如下:

      select to_char(scn_to_timestamp(1963220),'YYYY-MM-DD HH24:MI:SS') from dual;
      select timestamp_to_scn(to_date('2011-04-14 11:10:25','YYYY-MM-DD HH24:MI:SS')) from dual;

这种语句查找不需要实例做任何额外的改动。

第二种语句:

第二种语句如果想要执行结果成功,需要实例做一些改变。实例需要开启补充日志记录。否则查询出来的结果operation字段只有UNKOWN和BEGIN两个值,undo_sql字段则为空。

开启补充日志记录:

SQL> alter database add supplemental log data;

Database altered.

SQL> alter database add supplemental log data (primary key) columns;

Database altered.

查看是否开启补充日志记录:

SQL> select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI from v$database;
SUPPLEMENTAL_LOG_DATA_MIN SUPPLEMENTAL_LOG_DATA_PK SUPPLEMENTAL_LOG_DATA_UI
------------------------- ------------------------ ------------------------
YES                       YES                      NO

第二种语句查询的实验结果:

可以看到结果比第一种查询语句简洁明了得多,展示了操作类型,撤销操作的sql语句。


最后补充:普通用户在执行闪回事务查询之前,必须为用户授予适当的DBMS_FLASHBACK包上的权限。

   grant execute on dbms_flashback to user;

   grant select any transaction to user;


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

转载于:http://blog.itpub.net/28497416/viewspace-2124283/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值