ORA-04030
Table of Contents
1. 问题描述
现场运维人员反馈, 在测试环境,初始化数据时遇到如下错误:
ORA-12801: error signaled in parallel query server P046 ORA-04030:out of process memory when trying to allocate 268435480 bytes (QERHJ hash-joi,HT buckets)
可以看到 当时进程想要申请 256M pga 用于hash join,但是失败了。 从日志中查看相关SQL:
select /*+ full(a)parallel(a,5)*/ ....
SQL 启用了并行,那么也就是,当时这个会话申请1G的PGA.
2. 问题分析
2.1. 查看内存分配
SQL> show parameter sga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 50304M sga_target SQL> show parameter pga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pga_aggregate_target big integer 16G
可以看到 SGA 50G, PGA 16G. 内存分配没有什么问题。
2.2. 查看MOS
PLSQL Procedure Causing ORA-04030: (pga heap,control file i/o buffer) And ORA-04030: (koh-kghu sessi,pmuccst: adt/record) or ORA-04030: (koh-kghucall ,pmucalm coll) Errors (Doc ID 1325100.1)
3. 解决方案
两种解决方案,任选其一即可。建议修改系统参数。
3.1. 方案1:修改操作系统页面计数
##检查max_map_count当前值 more /proc/sys/vm/max_map_count ##关闭数据库实例 ##修改max_map_count sysctl -w vm.max_map_count=200000 或者 cat <>/etc/sysctl.conf vm.max_map_count=200000 EOF ##生效 sysctl -p ##重启主机 reboot ##启动数据库实例
- 注意
- 重启服务器后,先检查确认参数是否生效。
3.2. 方案2:修改数据库参数
3.2.1. Oracle 11204版本之前
##设置spfile参数,重启生效 alter system set "_use_realfree_heap"=TRUE scope=spfile; alter system set "_realfree_heap_pagesize_hint"=200000 scope=spfile;
3.2.2. Oracle 12.1版本之后
##设置spfile参数,重启实例生效 alter system set "_use_realfree_heap"=TRUE scope=spfile; alter system set "_realfree_heap_pagesize"=200000 scope=spfile;
4. 解决实验
我选择第二个方案。 操作步骤上简单点儿。 经现场运维测试, 之前报错的步骤已经通过。到此问题解决。
===================
天行健,君子以自强不息
地势坤,君子以厚德载物
===================
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?