是不是oracle9i的闪回技术,只能闪回查询呀,即它不能真正让已删除的数据又恢复,SQL> select * from score;ID   ENGLI MATH  CHINE
---- ----- ----- -----
xi   88    88    88
wen  99    99    99
xi   88    88    88
wen  99    99    99
wen  99    99    99SQL> delete  from score where id='wen';SQL> select * from score;ID   ENGLI MATH  CHINE
---- ----- ----- -----
xi   88    88    88
xi   88    88    88BEGIN 
    dbms_flashback.enable_at_time(to_timestamp('2009-3月-05 18:40:00','YYYY-MM-dd hh24:mi:ss'));--闪回
END;SQL> select * from score;ID   ENGLI MATH  CHINE
---- ----- ----- -----
xi   88    88    88
wen  99    99    99
xi   88    88    88
wen  99    99    99
wen  99    99    99SQL> exec dbms_flashback.disable();--关闭闪回SQL> select * from score;ID   ENGLI MATH  CHINE
---- ----- ----- -----
xi   88    88    88
xi   88    88    88
数据并没有回来呀?
就算我在关闭闪回之前,想把score中的数据存在到其它表中也不行,会提示
ERROR 位于第 1 行:
ORA-08182: 在闪回模式下操作不受支持

解决方案 »

  1.   

    参考:
    http://topic.csdn.net/u/20090304/11/4caf3173-0dab-415e-b098-36f5dacbebe6.html
      

  2.   

    从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后面可以跟TIMESTAMP或SCN。通过在查询表后面直接加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上。
      

  3.   

    是的,对于drop掉的数据,在9i中是无法使用flashback的..因为没有recycle存在.