求助:ORA-04030

[复制链接]
查看11 | 回复9 | 2011-11-1 16:24:04 | 显示全部楼层 |阅读模式
操作系统:AIX 6 数据库: Oracle 10g RAC2 Node 内存:16G
我用toad或plsql工具打开一张40多万行数据的表正常,但是当我浏览对应视图(组合查询出来的视图,数据量40多万)中的数据,会出现:
ORA-04030: out of process memory when trying to allocate 258072 bytes(QERHJ hash joi,kllcqas:kllsltba)
我在客户端执行一个比较复杂的插入语句,也会出现ORA-04030错误,但是在Oracle服务器的sqlplus中执行正常。

在网上google了一番,大概是以下原因造成的:
ORA-04030的问题一般是PGA过度分配造成的(对应的操作是sort/hash_join)。在Oracle9i中pga_aggregate_target指定了所有session总共使用的最大PGA上限,
如果该值被设定了则默认的workarea_size_policy=auto, sort_area_size/sort_area_retained_size将被忽略。
那么直接减小pga_aggregate_target就能解决一部分ORA-04030问题。
A. 对于32 BIT系统,有SGA 1.7G限制
B. 某些OS系统本身也有一些内存参数限制
--运行 ulimit 看看
C. OS系统本身物理内存+Swap的限制

Oracle相关参数如下:
SGA:
NAME
TYPEVALUE
------------------------------------ ----------- ------------------------------
lock_sga
boolean FALSE
pre_page_sga
boolean FALSE
sga_max_size
big integer 6G
sga_target
big integer 6G
PGA:
NAME
TYPEVALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target
big integer 762M

sort_area_size=65536
sort_area_retained_size=0
hash_area_size=131072

AIX系统 oracle用户资源限制如下:
$ ulimit -a
time(seconds)unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes)4194304
memory(kbytes) unlimited
coredump(blocks) unlimited
nofiles(descriptors) unlimited
threads(per process) unlimited
processes(per user)unlimited
/etc/security/limits中oracle用户的限制
oracle:
rss = -1
data = -1
stack = -1
fsize = -1
core = -1
nofiles = -1
其中stack堆栈明明是-1 ulimited,但是通过ulimit -a 显示 stack(kbytes)4194304
请各位大侠帮忙看下,如何解决这个ORA-04030错误。
回复

使用道具 举报

千问 | 2011-11-1 16:24:04 | 显示全部楼层
1.我觉得你的PGA有点儿小~可以看看相关视图
2.workarea_size_policy这个参数是什么?你是自动管理吗
回复

使用道具 举报

千问 | 2011-11-1 16:24:04 | 显示全部楼层
SQL> show parameter workarea_size_policy
NAME
TYPEVALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy
stringAUTO
回复

使用道具 举报

千问 | 2011-11-1 16:24:04 | 显示全部楼层
加大PGA在看看
回复

使用道具 举报

千问 | 2011-11-1 16:24:04 | 显示全部楼层
lsattr -E -l sys0 -a maxuproc
chdev -l sys0 -a maxuproc=8192
重启监听!
[ 本帖最后由 lanseguhun 于 2011-9-1 15:21 编辑 ]
回复

使用道具 举报

千问 | 2011-11-1 16:24:04 | 显示全部楼层
PGA从762M加到1564M,还是不行。
回复

使用道具 举报

千问 | 2011-11-1 16:24:04 | 显示全部楼层
你看看PGA的建议是多少?我觉得1G多还是少
回复

使用道具 举报

千问 | 2011-11-1 16:24:04 | 显示全部楼层
bash-3.2# lsattr -E -l sys0 -a maxuproc
maxuproc 128 Maximum number of PROCESSES allowed per user True
bash-3.2# chdev -l sys0 -a maxuproc=8192
sys0 changed
bash-3.2# lsattr -E -l sys0 -a maxuproc
maxuproc 8192 Maximum number of PROCESSES allowed per user True
执行完了,通过以下命令重启listener
srvctl stop listener -n nodename
srvctl start listener -nnodename
查询还是报ORA-04030错误
回复

使用道具 举报

千问 | 2011-11-1 16:24:04 | 显示全部楼层
我的也是在10g oracle for aix出问题了,见鬼。
回复

使用道具 举报

千问 | 2011-11-1 16:24:04 | 显示全部楼层
刚刚帮另外一个项目组解决了这个问题,他们最近经常出ORA-04030,
Oracle9i加32位的OS
由于OS的限制,内存方面调整能做的事情很少了, 我做了statspack,定位了最耗内存的语句都是由一个view导致的,
这个view每加合适的限制条件,系统用了2-3年以后变的很臃肿,我加了一个时间条件的限制以后就OK了.
当然每个人的情况不一样,给lz多一个解决问题的思路.
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行