我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!

由于博客中有大量代码,通过页面浏览效果更佳。

本案例来自一位同事的分享,主要现象是在 Oracle 11.2.0.4 的 RAC 环境中,节点2频繁出现 ORA-04031 错误。以下是详细的分析过程和处理建议。

一、什么是 ORA-04031 错误?

ORA-04031 错误的全称是 “unable to allocate X bytes of shared memory”,即“无法分配 X 字节的共享内存”。它通常发生在 Oracle 数据库的 Shared Pool 或其他 SGA 区域内存不足时。常见的报错信息如下:

Errors in file /u01/app/oracle/diag/rdbms/htz/htz2/trace/htz2_m000_319672.trc  (incident=226253):
ORA-04031: unable to allocate 4160 bytes of shared memory ("shared pool","unknown object","sga heap(6,0)","modification ")

1.1 ORA-04031 的常见原因

  • Shared Pool 设置过小,无法满足 SQL 解析、PL/SQL 代码、数据字典缓存等需求。
  • 内存碎片化,虽然总内存充足,但没有足够大的连续内存块可用。
  • 某些组件(如游标、包、过程等)频繁分配和释放内存,导致碎片。
  • 特定参数设置(如启用 AMM/ASMM、duration 机制)导致内存分配异常。

1.2 报错中的关键字段解释

  • "shared pool":表示分配内存失败的区域是 Shared Pool。
  • "unknown object":分配内存时的对象类型。
  • "sga heap(6,0)":具体的 subpool 和 duration,本文重点关注 duration 0。
  • "modification ":分配内存的原因。

二、分析过程

通过报错信息中的 sga heap(6,0) 可以看出,所有报错都来自 subpool 6 的 duration 0。

通常分析 ORA-04031 问题时,可以查看对应的 trace 文件,确认是否生成了 heapdump。如果没有,可以在业务低峰期手动采集 heap dump。但要注意,dump heap 操作会长时间持有 shared pool latch,可能导致数据库 hang 住。也可以通过查询 X$KSMSP 视图分析内存分布,但对于较大的 shared pool,这种查询也可能带来性能风险。

2.1 采集 heap dump 的方法

oradebug setmypid;
oradebug unlimit;
oradebug dump heapdump 536870914;
oradebug tracefile_name;
oradebug close_trace;

Level 参数说明

536870914 这个参数的含义如下:

  • 0x2 = SGA summary
  • 0x20000000 = 所有 heap 的 top sub heap 信息(LARGEST SUB HEAPS)

常用 level 说明如下:

1 PGA summary
2 SGA summary
4 UGA summary
8 Callheap (Current)
16 Callheap (User)
32 Large pool
64 Streams pool
128 Java pool
1025 PGA with contents
2050 SGA with contents
4100 UGA with contents
8200 Callheap with contents (Current)
16400 Callheap with contents (User)
32800 Large pool with contents
65600 Streams pool with contents
131200 Java pool with contents

采集到 heapdump 后,可以用 tp 大神的 heapdump_analyzer 脚本或 Oracle 官方的 heap.awk 工具进行分析。

2.2 heapdump 结果分析

示例分析结果如下:

--> HEAP DUMP heap name="sga heap(6,0)"  desc=0x6008bf00
Type Count Sum Average
~~~~ ~~~~~ ~~~ ~~~~~~~
perm 6 81833176 13638862.67
free 5 8336 1667.20
R-stopper 6 288 48.00
R-free 3 40267144 13422381.33

可以看到,subpool 6 duration 0 几乎被 perm 类型的 chunk 占满,free 的 32% 是保留池的 chunk。

详细分配如下:

Total_size #Chunks  Chunk_size,        From_heap,       Chunk_type,  Alloc_reason
29618736 1 29618736 , sga heap(6,0), perm, perm
50782208 1 50782208 , sga heap(6,0), perm, perm
...

几乎所有 perm 类型的内存都分配到了每个 subpool 的 duration 0。

三、为什么 duration 0 会频繁报 ORA-04031?

当启用 AMM/ASMM 并开启 duration 机制时,几乎所有 perm 类型的 chunk 都会分配到 duration 0。perm chunk 一旦分配给某个 shared pool 组件的 heap 后不会释放,也不能被其他组件使用,容易导致 duration 0 的 ORA-04031。

在 RAC 环境下,db cache 较大时会分配大量 perm chunk 给 RAC 特有的 shared pool 组件(如 gcs shadows、gcs resources、ges resources 等)。如果 shared pool 已经设置为合理大小,建议关闭 duration 机制。

四、处理建议

如果确认 shared pool 已经足够大,但仍频繁出现 ORA-04031,可以尝试关闭 duration 机制:

alter system set "_enable_shared_pool_durations"=false scope=spfile;

注意:该参数为隐含参数,修改前请充分评估风险,并在测试环境验证。

五、总结与建议

  • ORA-04031 是 Oracle 数据库中常见的内存分配错误,通常与 shared pool 设置、内存碎片化、参数配置有关。
  • 通过 heapdump 可以定位具体的内存分配情况,分析 perm chunk 的分布。
  • 在 RAC 环境下,合理设置 shared pool,并根据实际情况考虑关闭 duration 机制,有助于缓解该类问题。
  • 建议定期监控 shared pool 使用情况,及时调整参数,避免生产环境出现严重内存分配故障。

------------------作者介绍-----------------------

姓名:黄廷忠

现就职:Oracle中国高级服务团队

曾就职:OceanBase、云和恩墨、东方龙马等

电话、微信、QQ:18081072613

个人博客: (http://www.htz.pw)

CSDN地址: (https://blog.csdn.net/wwwhtzpw)

博客园地址: (https://www.cnblogs.com/www-htz-pw)


故障处理:ORA-04031真实案例分享的更多相关文章

  1. ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)

    前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了 ...

  2. ENode 2.6 架构与设计简介以及全新案例分享

    前言 ENode是一个应用开发框架,为开发人员提供了一整套基于DDD+CQRS+ES+EDA架构风格的解决方案.ENode从发布1.0开始到现在的差不多两年时间,我几乎每周都在更新设计或实现代码.以至 ...

  3. ArcGIS Add-in插件开发从0到1及实际案例分享

    同学做毕设,要求我帮着写个ArcGIS插件,实现功能为:遍历所有图斑,提取相邻图斑的公共边长及其他属性(包括相邻图斑的ID),链接到属性表中.搞定后在这里做个记录.本文分两大部分: ArcGIS插件开 ...

  4. Office 2010 KMS激活原理和案例分享

    Office 2010 KMS激活原理和案例分享     为了减低部署盗版(可能包含恶意软件.病毒和其他安全风险)的可能性,Office 2010面向企业客户推出了新的批量激活方式:KMS和MAK.这 ...

  5. Office 2010 KMS激活原理和案例分享 - Your Office Solution Here - Site Home - TechNet Blogs

    [作者:葛伟华.张玉工程师 ,  Office/Project支持团队, 微软亚太区全球技术支持中心 ] 为了减低部署盗版(可能包含恶意软件.病毒和其他安全风险)的可能性,Office 2010面向企 ...

  6. 利用UDP19端口实施DOS攻击的真实案例

    昨天在一个用户现场发现了一个利用UDP19端口对互联网受害者主机进行DOS攻击的真实案例.这个情况是我第一次见到,个人认为对以后遇到此类情况的兄弟具有参考价值.有必要做一个简单的分析记录. 在此次的分 ...

  7. 老李案例分享:Weblogic性能优化案例

    老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...

  8. 性能调优案例分享:Mysql的cpu过高

    性能调优案例分享:Mysql的cpu过高   问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务 ...

  9. 老李案例分享:MAT分析应用程序服务出现内存溢出过程

    老李案例分享:MAT分析应用程序服务出现内存溢出过程   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loa ...

  10. 老李案例分享:定位JAVA内存溢出

    老李案例分享:定位JAVA内存溢出   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loadrunner的培 ...

随机推荐

  1. Java 8的新特性还不了解?快进来!

    能坚持别人不能坚持的,才能拥有你想拥有的.关注 编程大道,让我们一起成长

  2. unigui的demo-\Demos\Desktop\DBAppDemo\SimpleDemo.dproj【11】

    这个demo很简单. 一个客户表,还有一个票据主从表. 看程序界面: 包括数据提交,彻头彻尾的c/s程序.你完全按照传统的C/S程序模式做开发就可.好处是效率.效率.还是效率! 你还有什么不满意!如果 ...

  3. Linux内存管理神器:smem工具

    大家好,我是良许. 今天给大家分享一款 Linux 系统里的内存管理神器:smem . smem 是Linux系统上的一款可以生成多种内存耗用报告的命令行工具.与现有工具不一样的是 smem 可以报告 ...

  4. 微软正式发布 .NET 10 Preview 3

    2025年4月11日,.NET团队在博客上宣布了.NET 10 Preview 3的正式发布,文章参见:https://devblogs.microsoft.com/dotnet/dotnet-10- ...

  5. 使用傅里叶级数和Python表示方波

    引言 在信号处理和数字通信中,方波是非常常见的一种波形.方波是一种周期性波形,信号在两个固定的幅度之间跳跃,通常是"高"与"低"的状态.你可能会问,如何通过数学 ...

  6. 如何基于 Kestrel 实现 socks5 代理

    前言 之前做了个轮子NZOrz, 本来打算慢慢参照Kestrel和Yarp长久地写着玩 奈何川普上台,关税,订婚案,自身和钱包等等各种乐子层出不穷,无暇慢悠悠地写轮子玩 还有有些盆友也想知道能否直接使 ...

  7. 题解:P10862 [HBCPC2024] Spicy or Grilled?

    题目翻译: 有 nnn 个人,我们为他们买了香辣鸡肉汉堡套餐,每份是 aaa 元,可是里面有 xxx 人不能吃辣,于是还准备了 xxx 份烤鸡汉堡套餐,每份是 bbb 元,求总共要多少元. 解题思路 ...

  8. Java IO--实现文件的加密解密

    我们知道文件存储的方式在计算机当中是以字节的方式进行存储的,可以通过对文件字节的操作来实现文件的加密. 下面的例子是通过读取文件的字节,然后使字节中的每一位取反(1变0,0变1),再进行倒置,来实现加 ...

  9. 【从0到1800 Star】90天,我用0预算推广了一个C语言项目

    亲爱的朋友们,我想和你们分享一下这90多天的开发旅程,虽然不涉及具体的技术部分,但我相信这些经验对你的项目会有所帮助哦 Catime是如何在大约90天内从0做到1800+ star的呢?其中最主要的原 ...

  10. K8S+nginx+MYSQL+TOMCAT高可用架构企业自建网站

    以下是基于 多Master高可用Kubernetes集群 的企业级部署详细步骤,涵盖 Nginx Ingress + MySQL高可用集群 + Tomcat负载均衡 的完整流程: 一.前置条件准备 1 ...