日期:2014-05-16  浏览次数:20477 次

ora-04030 进程内存不足解决方案
    转至:http://www.51testing.com/?uid-280547-action-viewspace-itemid-216224
方案一:
ora-04030:在尝试分配...字节 (hash-join subh,kllcqas:kllsltba) 时进程内存不足。 ora-04030:out of process memory when trying to allocate string bytes ora-04030的出现原因及解决方法: ora-04030出现的基本都是过多的使用memory造成的 oracle process使用的内存数量是有一定限制的: a. 对于32 bit系统,有sga 1.7g限制 b. 某些os系统本身也有一些内存参数限制 运行 ulimit 看看 c. os系统本身物理内存+swap的限制 现在我们应该检查db使用的sga + pga是否超过上面的限制。 sga 包括 db_cache,shared_pool,large_pool,java_pool session的pga包括sort_area_size/hash_area_size/*_area_size 或者 pga_aggregate_target 还有执行的code以及一些data也会占用空间。 然后再根据情况降低里面的某些值了,比如db_cache,sort_area_size等等。 假如是os系统的某limited造成的,大家可以考虑放开限制man ulimit来观察如何放开限制……
另外值得注意的是max_sga_size和sga_target的设置:
max_sga_size指的是可动态分配的最大值﹐而sga_target是当前已分配的最大sga。
max_sga_size是不可以动态修改的﹐而sga_target是可动态修改﹐直到max_sga_size的值(前提是你设定的max_sga_size>sga_target的情況)


如果在实例启动时﹐max_sga_size < sga_target或max_sga_size没设定﹐则启动后max_sga_size的值会等于sga_target的值,这时如果内存占用超过sga_target,也可能会出现ora-04030的错误。



方案二:
生产库迁移到2节点的aix oracle 10g rac 上后,应用系统查询出现ora-04030错误。
排除oracle内部参数的问题sga,pga等 。修改aix 的资源限制后,错误依旧。
/home/oracle$ulimit -a
time(seconds)        unlimited
file(blocks)         unlimited
data(kbytes)         unlimited
stack(kbytes)        unlimited
memory(kbytes)       unlimited
coredump(blocks)     unlimited
nofiles(descriptors) unlimited
经过两天的排查终于找到错误的原因:修改操作系统参数后,没有重启系统。重启aix后问题解决。
网上一篇关于aix资源限制的文章帮助我解决了这个问题。
原文链接地址如下:http://www.cublog.cn/u/7040/showart_124370.html
aix 用户使用的系统资源限制包括两个概念 --- 硬限制(hard limits) 和软限制(soft limits)。
hard limits自aix 4.1版本开始引入。hard limits 应由aix系统管理员设置,只有security组的成员可以将此值增大,
用户本身可以减小此限定值,但是其更改将随着该用户从系统退出而失效。使用下列命令可以查看hard limits的限定值:
ulimit -ha
soft limits 是aix核心使用的限制进程对系统资源的使用的上限值。此值可由任何人更改,但不能超出
hard limits值。这里要注意的是只有security组的成员可使更改永久生效,普通用户的更改在其退出系统
后将失效。使用以下命令可以查看soft limits的设置:
下面为系统的soft limits的默认值:
3.2
4.1-4.3
===============
=================
fsize = 2097151
fsize = 2097151
core = 2048
core = 2048
cpu = 3600
cpu = -1
data = 131072
data = 262144
rss = 65536
rss = 65536
stack = 8192
stack = 65536
nofiles = 2000*
nofiles=2000 *
* 该值(nofiles)只能在aix 4.3.1 或以后的版本中更改。
上述定义作为默认值存放在文件 /etc/security/limits 中,在新用户被加进系统后生效。直接更改此文件中的定义值
需要将系统重新启动以便使更改生效。将相应值该为"-1" 表示不受 soft limits的限制(unlimited)。
下面我们将就各字段逐一进行介绍:
fsize 用户创建的文件大小限制。此定义值(512字节为单位)为该用户可以生成的最大文件的大小。
core 生成的core文件大小的限制(512字节为单位)。
cpu 用户进程可用cpu的限定值(以秒为单位)。普通用户只能将此值减小,root可以将此值增大。这里要注意的
是进程使用cpu的时间取决于aix kernel(核心程序)进程调度算法,该值在此仅做参考。
data 进程数据段大小的限定值(以字节为单位)。
stack 进程堆栈段大小的限定值(以字节为单位)。
rss 进程常驻内存段的限定值(以字节为单位)。aix核心并不参考此限定。
nofiles 进程中打开文件的最大数量。此限定在aix 4.3.1之前的版本中固定为2000。在aix 4.3.1及其之后的版本中
可将此值增大至32767。
下面介绍三种修改上述限定值的方法:
1. 编辑文件/etc/security/limits,直接修改各定义值。此更改在系统重新启动后生效。
2. 使用命令ulimit修改默认值。例如:
ulimit -f value
ulimit -c
ulimit -t
ulimit -d
ulimit -s
ulimit -m
ulimit -n
将修改fsize, core, cpu,data, stack, rss和nofiles的soft limit值。
3. 使用命令chuser修改某用户的限定值。例如:
chuser fsize=
chuser core=
chuser cpu=
chuser data=
chuser limit=
chuser rss=
chuser nofiles=
将用户“username”的soft limits改为值“value”。
chuser hard_fsize=
chuser hard_core=
chuser hard_cpu=
chuser hard_data=
chuser hard_limit=
chuser hard_rss=
chuser hard_nofiles=
将用户“username”的hard limits改为值“value”。

本文来自csdn博客,转载请标明出处:http://blog.csdn.net/lwei_998/archive/2010/01/29/5269529.aspx

方案三:
查看>10m的session:

select name,