自己做了个实验,看看闪回版本查询是咋回事。
闪回版本的查询是基于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/