http://blog.csdn.net/emag_oracle/archive/2005/02/01/276707.aspx

解决方案 »

  1.   

    用select语句的flash back子句。很简单的。
      

  2.   

    我把piner的帖子贴一下:1、创建FLASH用户
    SQL> create user flash identified by flash; 
    SQL> grant connect, resource to flash; 
    SQL> grant execute on dbms_flashback to flash; 
    SQL> connect flash/flash 
    2、创建一个测试表 
    SQL> CREATE TABLE tst(t number(5)); 
    Table created. 
    SQL> INSERT INTO tst VALUES(1); 
    1 row created. 
    SQL> INSERT INTO tst VALUES(2); 
    1 row created. 
    SQL> COMMIT; 
    Commit complete. 
    SQL> CREATE TABLE keep_date (date_scn_tracking date); 
    Table created. 
    SQL> SELECT * FROM tst; 

    ---------- 


    注意:在执行步骤3或者步骤4之前,等待5分钟。
    3. 删除记录
    SQL> execute dbms_flashback.disable; 
    PL/SQL procedure successfully completed. 
    SQL> INSERT INTO keep_date select sysdate from dual; 
    1 row created. 
    SQL> COMMIT; 
    Commit complete. 
    SQL> DELETE FROM tst WHERE t = 1; 
    1 row deleted. 
    SQL> COMMIT; 
    Commit complete. 
    SQL> SELECT * FROM tst; 

    ---------- 

    通过以上的操作,我们插入了两条记录,并删除了其中一条记录,现在的结果是,我们这里只有一条记录了。在以下的操作中,我们将通过flashback query找到删除的记录
    4. 闪回查询 
    SQL> declare 
    2 restore_scn date; 
    3 begin 
    4 select date_scn_tracking into restore_scn from keep_date; 
    5 dbms_flashback.enable_at_time(restore_scn); 
    6 end; 
    7 / 
    PL/SQL procedure successfully completed. 
    SQL> SELECT * FROM tst; 

    ---------- 


    可以看到,虽然我们删除记录并提交了,但是通过特定操作,我们还能查询到删除前的两条记录,
    这里需要特别注意的是,Oracle 9i是每五分钟记录一次SCN的,并将SCN和对应时间的映射做个纪录。如果原来插入的记录到做闪回的时间在5分钟之内,用基于时间的flashback可能并查询不到记录,因为如果是基于时间点的查询,也是转化为最近的一次SCN,然后从这个SCN开始进行恢复,因此,如果需要精确的查询,我们可以采用基于SCN的flashback,它将能精确的闪回到需要恢复的时间,关于获取SCN,我们可以通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER或者LOGMNR。如
    DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(SCN_NUM); 
    来定位你的恢复时间点,下面是使用方法:
    SQL> VARIABLE SCN_SAVE NUMBER;
    SQL>EXECUTE :SCN_SAVE := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
    PL/SQL procedure successfully completed.SQL> print SCN_SAVE;
    SCN_SAVE
    ----------
    2.1202E+11SQL>execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:SCN_SAVE);最后注意,Oracle 9i的Flashback有如下限制。
    ·采用时间点的恢复,不能精确到最近5分钟,如果需要更精确的查询,需要采用SCN。
    ·不能flashback5天以前的数据,这个并不是undo_retention所能决定的。
    ·闪回查询无法恢复到表结构改变之前,因为闪回查询使用的当前的数据字典。
    ·由于受到undo_retention的影响,对于undo_retention之前的时间,flashback不保证能成功
    ·对于drop,truncate等不记录回滚的操作,flashback是无能为力的。
      

  3.   

    不需要那么复杂。
    SELECT * FROM table AS OF TIMESTAMP (to_timestamp('20051108 08:00:33','yyyymmdd hh24:mi:ss'));