在执行大事务时,有时oracle会报出如下的错误: ORA-01555:snapshot too old (rollback segment too small)   这说明oracle给此事务随机分配的回滚段太小了,这时可以为它指定一个足够大的回滚段,以确保这个事务的成功执行.例如 set transaction use rollback segment roll_abc; delete from table_name where ... commit;   回滚段roll_abc被指定给这个delete事务,commit命令则在事务结束之后取消了回滚段的指定.

解决方案 »

  1.   

    hi,
       bzszp(SongZip) :
        
       1.我不能指定对方系统的会滚段
       2.我还没有查到可以通过链路指定本事务在对方机器上使用的回滚段。
       3.另一个要确认的是,我做create table my_table as select * from link_table@link
         使用的是我的回滚段还是对方的回滚段,还是都有使用???
       4.希望有不改变数据库设置的解决方案。
      

  2.   

    我试着用了copy ,,但是不知道是什么原因,报了一堆乱七八遭的错误(我想不知道是不是
    对方系统的那张表一直在insert?)。。???
      

  3.   

    增加本地回滚段恐怕不能解决这个问题。
    这个问题比较常见,如果对方系统中的表一直有dml操作而且回滚段比较小的话(也就是在你取数据的transaction中间回滚段被重写了),那就只能通过增加对方系统中的回滚段来解决。另外一种思路是尽量缩短你取数据的时间,不如按照主键区间分批取数据、每次只复制一部分数据并及时提交。
      

  4.   

    KingSunSha(弱水三千) 兄 :
      麻烦的是对方系统的表没有主建,回滚段有好几个,有一个是很大的(21G),不过我实在想不出(也没有查到)我可以在本系统中指定使用对方系统的哪个回滚段。
      对方系统的设置我只能建议,不过基本上是不能更改的。
      不知道可不可以在对方系统中有这样的设置,及指定通过这个链路出来的会话都使用这个回滚段。
      在没有主建的情况下,我想每次分批取数据可能反倒是增加了系统工作量。
       所以一直在郁闷中………
       
      

  5.   

    确实没有办法为DBLINK所用的session指定回滚段对你这样的情况(没有主键),我也没有什么好办法,恐怕只能和对方商量了能不能改个思路,要求对方送出数据(文本或者dmp文件都可以),然后你再处理数据文件而不是直接读取数据库?
      

  6.   

    KingSunSha(弱水三千)兄:
      
           先谢谢之,,
           看来我觉得也只有用其他的思路来解决了。。