ORA闪回技术简介

9i开始, Oracle提供了闪回( FLASHBACK)功能。即查找当前时间之前的某个时间点系统或表的状态。
可以闪回的最大时间和回滚空间有关。如果使用了自动管理回滚表空间,那么 UNDO_RETENTION给出了闪回支持的最小时间。也就是说, FLASHBACK最少可以支持 UNDO_RETENTION给出的时间,如果系统比较闲,则可以闪回更长的时间。(当然,如果回滚表空间的空间分配不足,当系统处于忙时,有可能重用还没有达到 UNDO_RETENTION时间限制的数据的空间)
使用闪回的一个前提是表不能进行 DDL操作。不但不能对 DDL操作进行回闪,而且,也无法闪回到 DDL操作以前的数据了。
 
 
Oracle提供两种方法支持闪回:
一种是使用 DBMS_FLASHBACK包,这是 SESSION级的回闪。执行 DBMS_FLASHBACK包的 ENABLE_AT_TIME或者 ENABLE_AT_SYSTEM_CHANGE_NUMBER过程后,当前 session处于闪回状态,此时任何的查询返回的是 ENABLE_AT_TIME指定的时间点或 ENABLE_AT_SYSTEM_CHANGE_NUMBER指定的 SCN的时刻对应的状态。当执行 DISABLE过程后,系统恢复到当前状态。
这种方法是 SESSION级别,此后对任何表的任意的查询语句都返回以前某个时间点的结果。不过缺点是闪回状态下,不支持 DML语句。如果用以前的某个时间点的数据恢复当前数据,则必须 ENABLE_AT_TIME后,打开一个游标,然后 DIABLE闪回状态,然后从游标中读取数据并插入到当前表中。
第二种方式是采用 AS OF语句,这是语句级的回闪。 AS OF后面可以跟 TIMESTAMPSCN。通过在查询表后面直接加 AS OF时间点的方式,可以查询到那一时刻的数据。这种方法直观方便,使用于恢复个别表,或对某个表提供基于时间点的访问。
下面给出一个例子:
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
会话已更改。
SQL> create table t (id number, name varchar2(30));
表已创建。
SQL> insert into t values (1, 'yangtingkun');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select sysdate from dual;
SYSDATE
-------------------
2005-01-24 23:21:23
SQL> commit;
提交完成。
SQL> commit;
提交完成。
SQL> commit;
提交完成。
SQL> commit;
提交完成。
SQL> commit;
提交完成。
SQL> select sysdate from dual;
SYSDATE
-------------------
2005-01-24 23:26:05
SQL> delete t;
已删除 1 行。
SQL> commit;
提交完成。
SQL> commit;
提交完成。
SQL> select * from t;
未选定行
SQL> select * from t as of timestamp to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss');
        ID NAME
---------- ------------------------------
         1 yangtingkun
上面给出了通过两种方法实现回闪查询的方法。在上面的例子中,我在执行 insert命令和 delete命令直接间隔了 5分钟左右,且提交了一些空事务。这样做的原因是由于 Oracle把时间点映射到 SCN上,大约每 5分钟左右映射一次。因此两个操作间隔 5分钟,且保证两个操作间 SCN发生了变化,从而使 Oracle可以将 timestamp正确的映射到不同的 SCN上。

你可能感兴趣的:(职场,休闲,数据库 闪回)