交换分区报:ora-01555

[复制链接]
查看11 | 回复5 | 2014-2-18 16:43:09 | 显示全部楼层 |阅读模式
先说明下:数据库oracle 11g,主表现在有近50亿行数据,分区表,月分区(业务需要),每月近2亿行。现在是把每天的数据放到一个临时表里面,共一个月的数据量,最后跟主表交换分区,这样报ORA-01555:snapshot too old:rollback segment number 14 with name 错误,这样如何解决??? 另:undo表空间300G,对于单独delete、insert语句也会报同样的错误,如何解决????

回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层


各位发表下意见吧!!!
回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
椰风海韵158 发表于 2014-11-15 08:45
各位发表下意见吧!!!

在SQLPLUS中执行 show parameter undo ,然后再执行
SELECT min(tuned_undoretention),MAX(tuned_undoretention),AVG(tuned_undoretention) FROM v$undostat;
将以上结果发上来,另外,还有你进行分区交换操作大致需要运行的时间长度。
回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
bfc99 发表于 2014-11-15 10:50
在SQLPLUS中执行 show parameter undo ,然后再执行
SELECT min(tuned_undoretention),MAX(tuned_undor ...

show parameter undo :
name
type
value
_undo_autotune boolean
FALSE
undo_managementstring
AUTO
undo_retention
integer
900
undo_tablespacestring
UNDOTBS1
SELECT min(tuned_undoretention),MAX(tuned_undor ...
3个值都为0

因为所有的sql语句都在脚本里面执行,包括建临时表,往临时表里面插数,跟主表交换分区,最后重建索引等。现在是执行到交换分区的时候报错,报错时脚本总共执行时间大概是一个半小时。
因为是生产环境报错的,数据回复到最初报错前的状态会麻烦,所以现在是想找到个好的办法再重新回复数据重跑,开发环境没有那么多数据,所以现在报错情景不能重试重演。以上两个语句是现在查询到的,给予参考。

回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
本帖最后由 bfc99 于 2014-11-15 14:44 编辑
椰风海韵158 发表于 2014-11-15 13:57
show parameter undo :
name
type
value
_undo_au ...

几个建议,供参考:
1、_undo_autotune 这个参数设置为TURE。系统会根据语句的运行时间,可用的UNDO表空间大小等,自动确定并调整UNDO数据的保留时长。
2、增大undo_retention的设置值,如果按2小时计,则为2*60*60=7200(秒)。但这个值只是要求数据库尽量去满足,如果遇到UNDO表空间空间不足时,依然保留不了那么长的时间。
3、配合建议2,修改UNDO表空间的属性为retention guarantee.修改后,会确保相应的UNDO数据被留设置的时间长度。但如果空间不足,会报错。
alter tablespace undotbs1 retention guarantee;
补充:建议1和建议2、3是互斥的。相当于一个是自动的,一个是手动的。

回复

使用道具 举报

千问 | 2014-2-18 16:43:09 | 显示全部楼层
可以考虑减少维护索引的回滚开销
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行