ORA-04030: out of process memory when trying to allocate 25808 bytes解决方法

文章描述了当遇到Oracle生产系统中ORA-04030错误,由于PGA内存问题导致的进程限制。问题源于操作系统对内存映射条目的默认限制。解决方案包括调整`vm.max_map_count`以增大单进程PGA容量,或者优化SQL以减少PGA使用。隐含参数修改需谨慎,生产环境中首选SQL优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 问题背景

收到客户反馈,生产系统报表运行过程中报错,报错为ORA-04030,pga内存的问题
在这里插入图片描述

查看alert日志,发现期间有大量ORA-04030报错
在这里插入图片描述
但是查看pga参数的设置,发现为100G
在这里插入图片描述
打开trace文件,可以看到具体报错。这些错误的出现通常是因为 map 条目耗尽造成的。每个进程仅仅有65536个memory map条目
在这里插入图片描述

二、 报错原因

下面为官方文档中的描述
在这里插入图片描述在这里插入图片描述
而报错原因是:操作系统有默认单个进程最多只能打开65530个内存映射条目的限制。
cat /proc/sys/vm/max_map_count
65530
数据库有与之对应的隐含参数_realfree_heap_pagesize_hint,默认是65536,意思是realfree当前的分配大小是65536 bytes(64K)。

SELECT x.ksppinm NAME, y.ksppstvl VALUE,x.ksppdesc describ
FROM SYS.x$ksppi x, SYS.x$ksppcv y
WHERE x.indx = y.indx AND x.ksppinm = '_realfree_heap_pagesize_hint';

在这里插入图片描述

这个隐含参数表示操作系统上每个内存映射条目大小是64K,而操作系统上又限制每个进程最多能打开65530个内存映射条目,因此,每个进程使用PGA就不能超过4G。

三、 解决方法

下面为官方文档中的解决方法
在这里插入图片描述

具体操作如下

  1. 加大单个进程可打开的内存映射条目大小
vi /etc/sysctl.conf
#修改为262144,单进程可用PGA变为16G
vm.max_map_count=262144
#参数生效
sysctl –p

或使用sysctl -w 临时生效

sysctl -w vm.max_map_count=262144

这样每个内存映射条目大小64K,262144个条目就是16G,应该足够用了。这也是官方文档推荐的改法。

  1. 加大每个内存映射条目大小
alter system set "_realfree_heap_pagesize_hint"=262144 scope=spfile;

修改隐藏参数

alter system set "_use_realfree_heap"=true scope=spfile;

上面的修改也会对应单进程PGA最大可用内存为16G,但是要重启数据库生效,并且隐含参数通常不建议修改

  1. 优化SQL
    对于生产环境数据库来说,优先考虑这种方法,分析为什么要占用那么多PGA,从而进行优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值