ORA-04030

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. 解决实验

我选择第二个方案。 操作步骤上简单点儿。 经现场运维测试, 之前报错的步骤已经通过。到此问题解决。

posted @ 2024-09-03 18:08  halberd.lee  阅读(23)  评论(0编辑  收藏  举报