三、Flashback Query
Flashback 是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。
1、Flashback Query概念
正如前言中所提,Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据!
什么是多版本读一致性
Oracle 采用了一种非常优秀的设计,通过undo 数据来确保写不堵塞读,简单的讲,不同的事务在写数据时,会将数据的前映像写入undo 表空间,这样如果同时有其它事务查询该表数据,则可以通过undo 表空间中数据的前映像来构造所需的完整记录集,而不需要等待写入的事务提交或回滚。timestamp(基于时间)或as of scn(基于scn)即可。as of timestamp|scn 的语法是自9iR2 后才开始提供支持 。
flashback query 有多种方式构建查询记录集,记录集的选择范围可以基于时间或基于scn,甚至可以同时查询出记录在undo 表空间中不同事务时的前映象。用法与标准查询非常类似,要通过flashback query 查询undo 中的撤销数据,最简单的方式只需要在标准查询语句的表名后面跟上as of
2、Flashback Query的示例
As of timestamp 的示例:
SYS@ orcl >alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SYS@ orcl >select sysdate from dual;
SYSDATE
-------------------
2013-05-23 01:14:45
SYS@ orcl >select * from test014;
ID
----------
1
2
模拟用户误操作,删除数据
SYS@ orcl >delete from test014;
2 rows deleted.
SYS@ orcl >commit;
Commit complete.
查看删除之前的状态:
oracle 11g不需要等5分钟,9i/10g需要等5分钟
SYS@ orcl >select * from test014 as of timestamp sysdate-5/1440;
ID
----------
1
2
或者:
SYS@ orcl >select * from test014 as of timestamp to_timestamp('2013-05-23 01:14:45','yyyy-mm-dd hh24:mi:ss');
ID
----------
1
2
4
用Flashback Query恢复之前的数据:
SYS@ orcl >insert into test014 select * from test014 as of timestamp to_timestamp('2013-05-23 01:14:45','yyyy-mm-dd hh24:mi:ss');