|
通过执行一个带as of 子句的select语句进行闪回查询,可以闪回检索过去某个时间存在的数据,一个闪回查询被用来重现过去存在过的数据,这个查询明确的引用了过去的一个时间段或SCN号,闪回查询返回的数据都是过去某时刻已经提交的数据。
可能使用到闪回查询的地方:
1、恢复丢失的数据或撤销已经提交的错误。例如如果你不小心删除或更新了行,并且做了提交操作,你可以立刻撤销这个错误。
2、比较当前数据和历史数据的一致性。例如,你可能需要生成一份前一天数据更新的日报告,你可以分别比较表的每一行或找到行的交集和并集。
3、在某个特殊时间检查事务型数据的状态。例如,你可以在某一天验证账户收支。
4、移除某些因需求储存的暂时数据以简化应用设计。通过闪回查询你可以从数据库中直接获取到过去的数据。
5、使用包装应用(例如报表生成工具)的历史数据
6、为应用提供自服务错误更正,因此可以让用户撤销或更正他们的错误。
示例:
SQL> select * from scott.dept;
DEPTNO DNAME LOC
---------- ---------------------------- -------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
现在,我们来增加一条数据,并提交:
SQL> insert into scott.dept values(50,'错误数据','CHINA');
已创建 1 行。
SQL> select * from scott.dept;
DEPTNO DNAME LOC
---------- ---------------------------- -------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 错误数据 CHINA
SQL> commit; (2016-5-3 15:50:00)
提交完成。
正常情况下,由于已经做了commit操作,所以rollback已经无效了,要想得到2016-5-3 15:50:00之前的数据,怎么办?
使用timestamp时间点闪回:
SQL> select * from scott.dept as of timestamp to_timestamp('2016-05-03 15:30:00','yyyy-mm-dd hh24:mi:ss');
DEPTNO DNAME LOC
---------- ---------------------------- -------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
闪回查询,主要依靠表空间的undo数据,如果想要追溯更久的数据,就需要设置较大的undo_tablespaces大小和undo_retention。
如果想直接更新当前的表到历史的某个时间状态,可以直接使用flashback关键字:
SQL> alter table scott.dept enable row movement;
表已更改。
SQL> flashback table scott.dept to timestamp to_timestamp('2011-12-09 10:00:00','yyyy-mm-dd hh24:mi:ss');
闪回完成。
|
|