1. FLASHBACK TABLE table_name TO BEFORE DROP
  这个时间限制是多久?如果希望时间久一点,该怎么设置?
2. select * FROM BIOLIFE  as of timestamp(to_timestamp('2009-11-28 21:09:09','yyyy-mm-dd hh24:mi:ss'))   这个时间限制是多久?如果希望时间久一点,该怎么设置?

解决方案 »

  1.   

    这要看你的UNDO表空间中相关的内容可以存在多久
    如果相关的前镜像被覆盖了 那么操作就会失败了
      

  2.   

    设置初始化参数UNDO_RETENTION该参数用来指定undo 记录保存的最长时间,以秒为单位,是个动态参数,完全可以在实例运行时随时修改通常默认是900 秒,也就是15 分钟。
    一定要注意,undo_retention 只是指定undo 数据的过期时间,并不是说,undo 中的数据一定会在undo表空间中保存15 分钟,比如说刚一个新事务开始的时候,如果undo 表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此呢,这就又关联回了第一点,当你创建
    一个自动管理的undo 表空间时,还要注意其空间大小,要尽可能保证undo 表空间有足够的存储空间。
    同时还要注意,也并不是说,undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback 特性引用。如果你的undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo 数据,它就会持续有效。因此呢,这里还是那句话,要注意undo 表空间的大小,保证其有足够的存储空间。
    只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖,例如:
    SQL> Alter tablespace undotbs1 retention guarantee;
    如果想禁止undo 表空间retention guarantee,例如:
    SQL> Alter tablespace undotbs1 retention noguarantee;Oracle Flashback 技术 总结http://blog.csdn.net/tianlesoftware/archive/2009/10/16/4677378.aspx------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716 
      

  3.   


    --三个系统参数关系到flashback时间
    [SYS@ora10gr1#2009-11-29/10:35:35] SQL>show parameter undo_NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    undo_management                      string      AUTO
    undo_retention                       integer     900
    undo_tablespace                      string      UNDOTBS1
    1、undo_management 为 AUTO 说明你可以使用flashback 功能
    2、undo_retention 为900 是默认的可恢复的时间
    3、undo_tablespace 是你正在使用的undo tablespace名但是如果你的undo空间是下面这个样子的话,不会完全的保证900秒的时间,而会出现时间不固定的情况。
    当undo信息被覆盖的时候flashback就不可以了。
    [SYS@ora10gr1#2009-11-29/10:38:49] SQL>select TABLESPACE_NAME,RETENTION from dba_tablespaces where TABLESPACE_NAME='UNDOTBS1';TABLESPACE_NAME                RETENTION
    ------------------------------ -----------
    UNDOTBS1                       NOGUARANTEE
    如果想完全保证这个时间,需要把 undo表空间改成 GUARANTEE的,同时增大你的undo表空间的大小。
    --把 undo表空间改成guarantee
    alter tablespace UNDOTBS1 retention guarantee;
    --增大 undo表空间大小
    alter tablespace UNDOTBS1 add datafile 'XXXXX' size 100M;
    --或者把undo表空间改成自动扩展的
    [SYS@ora10gr1#2009-11-29/10:39:21] SQL>select name from v$datafile;NAME
    --------------------------------------------------------------------------------
    D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORA10GR1\SYSTEM01.DBF
    D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORA10GR1\UNDOTBS01.DBF
    D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORA10GR1\SYSAUX01.DBF
    D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORA10GR1\USERS01.DBF
    D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORA10GR1\EXAMPLE01.DBF
    D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORA10GR1\TEST01.DBFalter system datafile 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORA10GR1\UNDOTBS01.DBF' autoextend on;
    这样就可以尽可能长时间的保留 flashback信息了。
      

  4.   

    忘了一点,还要修改系统参数 undo_retention 的大小,以满足你的需要。这个参数的设置可以参考select max(maxquerylen) from v$undostat;
    修改方法:--注意这个参数是以秒为单位的。
    alter system set undo_retention = 3600 scope = both;
      

  5.   

    你说的是不是UNDOTBS1这个表空间?不过我看了一下回退段是建在SYSTEM表空间上的啊。
    CREATE ROLLBACK SEGMENT SYSTEM
      TABLESPACE SYSTEM
      STORAGE    (
                  INITIAL          112K
                  MINEXTENTS       1
                  MAXEXTENTS       32765
                 );
    ALTER ROLLBACK SEGMENT SYSTEM ONLINE;
      

  6.   

    select * FROM BIOLIFE  as of timestamp(to_timestamp('2009-11-28 21:09:09','yyyy-mm-dd hh24:mi:ss')) 
    会提示:
    ORA-01555:快照过旧:回退段号9(名称为“_SYSSMU9¥”)过小
      

  7.   

    SQL> select * from v$rollname;       USN NAME
    ---------- ------------------------------
             0 SYSTEM
             1 _SYSSMU1$
             2 _SYSSMU2$
             3 _SYSSMU3$
             4 _SYSSMU4$
             5 _SYSSMU5$
             6 _SYSSMU6$
             7 _SYSSMU7$
             8 _SYSSMU8$
             9 _SYSSMU9$
            10 _SYSSMU10$11 rows selected.
    SQL> select segment_name,tablespace_name from dba_segments where segment_name='S
    YSTEM';
    SEGMENT_NAME         TABLESPACE_NAME
    -------------------- --------------------
    SYSTEM               SYSTEM
    SQL> select segment_name,tablespace_name from dba_segments where tablespace_name
    ='UNDOTBS1';SEGMENT_NAME         TABLESPACE_NAME
    -------------------- --------------------
    _SYSSMU1$            UNDOTBS1
    _SYSSMU2$            UNDOTBS1
    _SYSSMU3$            UNDOTBS1
    _SYSSMU4$            UNDOTBS1
    _SYSSMU5$            UNDOTBS1
    _SYSSMU6$            UNDOTBS1
    _SYSSMU7$            UNDOTBS1
    _SYSSMU8$            UNDOTBS1
    _SYSSMU9$            UNDOTBS1
    _SYSSMU10$           UNDOTBS110 rows selected.
      

  8.   

    一般情况下是不会去使用SYSTEM这个回滚段的你的错误提示已经很明显了 回滚空间太小
    你可以选择增大回滚表空间
    或者按照上面的朋友说的使用RETENTION GUARANTEE来解决这个问题
      

  9.   

    CREATE UNDO TABLESPACE UNDOTBS1 DATAFILE 
      'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF' SIZE 140M AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
    ONLINE
    RETENTION NOGUARANTEE
    BLOCKSIZE 8K
    FLASHBACK ON;UNDO 表空间还有100M的空间,而且设成了AUTOEXTEND on, 为什么还会提示 回滚空间太小?
      

  10.   

    参数文件中:
    ###########################################
    # System Managed Undo and Rollback Segments
    ###########################################
    undo_management=AUTO
    undo_tablespace=UNDOTBS1
      

  11.   

    “只要没有事务去覆盖undo 数据,它就会持续有效。”
    这句话该怎么理解?
    是不是说我删除了某个表A的数据,然后只要再对表A进行操作,就会覆盖undo数据,这样表A中被删除的数据就不可恢复?
      

  12.   

    “只要没有事务去覆盖undo 数据,它就会持续有效。” 比如说USERA更改了T1表中的数据
    那么这个时候T1表中被更改数据的前镜像就会被存到回滚段中
    那么这个时候你可以用闪回去查询这些数据被更改前的内容不过如果在USERA进行了操作以后 又有大量的事务操作 从而产生大量的UNDO
    那么T1表中被更改数据的前镜像在回滚段中可能会被这些新事务产生的UNDO覆盖(当然 如果你USER1更改T1表的这个事务没有COMMIT 那么这些前镜像会一直保存)
    因为UNDO表空间是循环使用的