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
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
---这样子试下 回滚段太小了,因为你的事务还没有完成而回滚段的空间已经没有了。 CREATE ROLLBACK SEGMENT rolltest STORAGE (INITIAL 10M NEXT 10M OPTIMAL 20M) ALTER ROLLBACK SEGMENT rbs_rolltest ONLINE 在你的过程中 set transaction use rollback segment rbs_rolltest
// *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
http://blog.csdn.net/hdhai9451/archive/2009/02/07/3867176.aspx
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
回滚段太小了,因为你的事务还没有完成而回滚段的空间已经没有了。
CREATE ROLLBACK SEGMENT rolltest STORAGE (INITIAL 10M NEXT 10M OPTIMAL 20M)
ALTER ROLLBACK SEGMENT rbs_rolltest ONLINE
在你的过程中
set transaction use rollback segment rbs_rolltest
2:设置oracle的快照刷新频率,也就是手工管理回滚段的数据,也不是刷新频率越大越好,同样太小也不好,要适中
3:优化导数据机制,提高导数据的效率原因:导数据的时候,系统会select要导的数据内容导回滚段中,然后后续的执行从就回滚段中查数据,但是oracle对回滚段数据有一定的管理机制,当新数据要用回滚段的时候,会删掉回滚段中的老数据装新数据,当导出程序使用的数据会占用掉的时候,就出现快照过旧,快照不可用;但是当一直没有新数据装入占用,也就是没有上面那种情况出现,但是程序导出数据很慢,oracle对回滚段中的数据占用了回滚段到一定时间以后,oralce就认为这个数据不再可用了,这个时间可以设置,也会出现快照过旧的错误最根本的方法就是提高程序导出的效率,在过旧前就完成事务;或者把要导出的数据分开多次查询,例如一次导一天数据等等,导出设置一个循环,能很大程度的避免这种问题。
(
INITIAL 1200k
NEXT 1200k
MINEXTENTS 2
MAXEXTENTS 120
OPTIMAL 2400k
);
ALTER ROLLBACK SEGMENT r05 ONLINE;
在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
而公共回退段将不受参数文件的限制
在回退段中,段的头部存储正在使用的回退段事务的信息,一个事务只能使用一个回退段来存放它的回退信息,而一个回退段可以存放多个事务的回退信息。
回退段再大,但是处理速度慢,一样会过旧,并不是说回滚段不够用,而是占用了回滚段时间太长,oracle把这个段的数据认为是旧数据不可用了想办法提高效率,或者分批导出,在一个导出中设置循环,按照一定的逻辑分段,肯定能解决你问题