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. 解决实验
我选择第二个方案。 操作步骤上简单点儿。 经现场运维测试, 之前报错的步骤已经通过。到此问题解决。
===================
天行健,君子以自强不息
地势坤,君子以厚德载物
===================