用sql server的dts通过odbc将oracle数据导入到sql server,导出数据到460多万条时出现错误:【oracle】 【odbc】ora-01555:快照过旧:回退段号 4 在名称为 “_syssmu4$”过小请高手指教

解决方案 »

  1.   

    SQL>show parameter undo1555, 00000, "snapshot too old: rollback segment number %s with name \"%s\" too small"
    // *Cause: rollback records needed by a reader for consistent read are
    //         overwritten by other writers
    // *Action: If in Automatic Undo Management mode, increase undo_retention
    //          setting. Otherwise, use larger rollback segments
      

  2.   

    这是有保证一致性的UNDO的空间问题,参考一下这个
    http://blog.csdn.net/hdhai9451/archive/2009/02/07/3867176.aspx
      

  3.   

    ORA-01555: snapshot too old: rollback segment number string with name "string" too small 
    Cause: rollback records needed by a reader for consistent read are overwritten by other writers
    Action: If in Automatic Undo Management mode, increase undo_retention setting. Otherwise, use larger rollback segments
      

  4.   

    ---这样子试下
    回滚段太小了,因为你的事务还没有完成而回滚段的空间已经没有了。   
      CREATE   ROLLBACK   SEGMENT   rolltest   STORAGE   (INITIAL   10M   NEXT   10M   OPTIMAL   20M)   
      ALTER   ROLLBACK   SEGMENT   rbs_rolltest   ONLINE   
      在你的过程中   
      set   transaction   use   rollback   segment   rbs_rolltest
      

  5.   

    1:增加回滚段大小,但是不是越大越好
    2:设置oracle的快照刷新频率,也就是手工管理回滚段的数据,也不是刷新频率越大越好,同样太小也不好,要适中
    3:优化导数据机制,提高导数据的效率原因:导数据的时候,系统会select要导的数据内容导回滚段中,然后后续的执行从就回滚段中查数据,但是oracle对回滚段数据有一定的管理机制,当新数据要用回滚段的时候,会删掉回滚段中的老数据装新数据,当导出程序使用的数据会占用掉的时候,就出现快照过旧,快照不可用;但是当一直没有新数据装入占用,也就是没有上面那种情况出现,但是程序导出数据很慢,oracle对回滚段中的数据占用了回滚段到一定时间以后,oralce就认为这个数据不再可用了,这个时间可以设置,也会出现快照过旧的错误最根本的方法就是提高程序导出的效率,在过旧前就完成事务;或者把要导出的数据分开多次查询,例如一次导一天数据等等,导出设置一个循环,能很大程度的避免这种问题。
      

  6.   

    是否在enterprise manager console中的存储—>回退段—>system中的存储值的最大数量设置为无限制就可以了?初始大小为112kb,不能改变,下一个大小和最佳大小可以改变
      

  7.   

    是否要针对我的tablespace设置回退段?我要导出5万条记录的话设置多大为好?
      

  8.   

    可以啊 ...那你就用这个好了CREATE   ROLLBACK   SEGMENT   r05   TABLESPACE   rbs   STORAGE   
      (   
                INITIAL           1200k   
                NEXT                 1200k   
                MINEXTENTS     2   
                MAXEXTENTS     120   
                OPTIMAL           2400k   
      );   
      ALTER   ROLLBACK   SEGMENT   r05   ONLINE;   
      

  9.   

    我觉得不是回滚段太小,而是像楼上有人说刷新频率的问题,因为我以前导出800万条数据都没有问题,因为当时速度快,但现在导出到500万出错,因为速度太慢。如果没有给tablespace指定回滚段,应该默认使用system回滚段,我现在的system回滚段的设置得非常大了
      

  10.   

    回退段用于存储用户数据修改之前的值,因而可以在特定条件下回退数据。回退段与事务是一对多的关系,一个事务只能使用一个回退段,而一个回退段可存放一个或多个事务的回退数据。
      在oracle8i及之前的版本中,管理回退段是项很复杂的工作,管理员需要根据每个事务的大小和事务数量来确定、计算回退段的数量及存储参数,在oracle9i之后,oracle增加了undo表空间,由系统自动管理它。从此不再需要考虑对回退段的管理。参数undo_management决定数据库使用的是回退段还是undo表空间,其值为auto表示使用undo表空间自动管理,manual表示手动管理回退段。undo_management=manual在创建新的数据库时,Oracle将在System表空间中建立一个默认的System回退段。System回退段只应当用于存放Oracle系统事务的回退记录,任何用户事务都不应当使用System回退段。#在创建数据库之后,应当立即在System表空间中建立一个非System回退段,因为在数据库创建后,用户需要首先创建其他的表空间和回退段。这时,这些操作的回退记录将保存在这个非System回退段中,而不会保存在System回退段中。在其他的表空间和回退段建立完毕后,可以将System表空间中的这个非System回退段删除。实例启动时获取的回退段数目由多种方法确定:
    ·实例所获取的公用回退段数目由transaction,transaction_per_rollback_segments指定
    ·实例所获取的私有回退段目和名称由rollback_segments决定。
    #此外,一个实例所允许使用的最大回退段数目max_rollback_segments=ceil(transaction/transaction_per_rollback_segments)。在一个实例中,如果同时使用公用回退段和私有回退段,实例首先获取由rollback_segments参数指定的私有回退段,然后再通过ceil(transactions/transactions_per_rollback_segments)计算的值与已获取的私有回退段数目的差额需要通过获取公有回退段来补偿。·创建私有回退段
    create rollback segments XXX
    tablespace XXX
    storage (initial XXX
                 next  XXX
                 optimal XXX
                 pctincrease 0
                 minextents XXX
                 maxextents XXX  )
    ·创建公有回退段
    create public rollback segments XXX 
          ……#online offline
    ·alter rollback segment XXX online/offline
    ·利用参数文件(仅限于私有回退段)
      rollback_segments
      将私有回退段添加入该参数,重启后,则该回退段的状态将永久性为onlne
      没有写入参数文件的回退段在数据库重新启动后,再次重新启动后,变为offline
      而公共回退段将不受参数文件的限制
    在回退段中,段的头部存储正在使用的回退段事务的信息,一个事务只能使用一个回退段来存放它的回退信息,而一个回退段可以存放多个事务的回退信息。 
      

  11.   

    系统参数不用调了,刷新频率就是指刷新时间或者叫认为过期快照的时间,这个也不用调
    回退段再大,但是处理速度慢,一样会过旧,并不是说回滚段不够用,而是占用了回滚段时间太长,oracle把这个段的数据认为是旧数据不可用了想办法提高效率,或者分批导出,在一个导出中设置循环,按照一定的逻辑分段,肯定能解决你问题