oracle进程内存不足1046552,ora-04030 进程内存不足解决方案

方案一:

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资源限制的文章帮助我解决了这个问题。

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”。

方案三:

查看>10M的session:

SELECT NAME, VALUE / 1024 / 1024, s.SID, s.serial#, spid

FROM v$session s, v$sesstat st, v$statname sn, v$process p

WHERE st.SID = s.SID

AND st.statistic# = sn.statistic#

AND sn.NAME LIKE 'session pga memory'

AND p.addr = s.paddr

AND VALUE > 10 * 1024 * 1024;

问题:

Thu Nov 06 09:56:41 2008

Errors in file e:\oracle\admin\nisczy\udump\nisczy_ora_2484.trc:

ORA-04030: 在尝试分配 8512 字节 (pga heap,ksm stack) 时进程内存不足

ORA-04030: 在尝试分配 8512 字节 (pga heap,ksm stack) 时进程内存不足

ORA-04030: 在尝试分配 8204 字节 (koh-kghu call ,pl/sql vc2) 时进程内存不足

Thu Nov 06 09:56:43 2008

Errors in file e:\oracle\admin\nisczy\udump\nisczy_ora_2484.trc:

ORA-00603: ORACLE server session terminated by fatal error

ORA-04030: out of process memory when trying to allocate 8512 bytes (pga heap,ksm stack)

ORA-04030: out of process memory when trying to allocate 8512 bytes (pga heap,ksm stack)

ORA-04030: out of process memory when trying to allocate 8204 bytes (koh-kghu call ,pl/sql vc2)

解决:

SQL> conn /as sysdba

已连接。

SQL> alter session set sort_area_size = 104857600;

会话已更改。

SQL> show parameter sort;

sort_area_size                       integer

104857600

SQL> conn gistar/res#pwd

已连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值