故障处理:ORA-04031真实案例分享
我们的文章会在微信公众号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真实案例分享的更多相关文章
- ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)
前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了 ...
- ENode 2.6 架构与设计简介以及全新案例分享
前言 ENode是一个应用开发框架,为开发人员提供了一整套基于DDD+CQRS+ES+EDA架构风格的解决方案.ENode从发布1.0开始到现在的差不多两年时间,我几乎每周都在更新设计或实现代码.以至 ...
- ArcGIS Add-in插件开发从0到1及实际案例分享
同学做毕设,要求我帮着写个ArcGIS插件,实现功能为:遍历所有图斑,提取相邻图斑的公共边长及其他属性(包括相邻图斑的ID),链接到属性表中.搞定后在这里做个记录.本文分两大部分: ArcGIS插件开 ...
- Office 2010 KMS激活原理和案例分享
Office 2010 KMS激活原理和案例分享 为了减低部署盗版(可能包含恶意软件.病毒和其他安全风险)的可能性,Office 2010面向企业客户推出了新的批量激活方式:KMS和MAK.这 ...
- Office 2010 KMS激活原理和案例分享 - Your Office Solution Here - Site Home - TechNet Blogs
[作者:葛伟华.张玉工程师 , Office/Project支持团队, 微软亚太区全球技术支持中心 ] 为了减低部署盗版(可能包含恶意软件.病毒和其他安全风险)的可能性,Office 2010面向企 ...
- 利用UDP19端口实施DOS攻击的真实案例
昨天在一个用户现场发现了一个利用UDP19端口对互联网受害者主机进行DOS攻击的真实案例.这个情况是我第一次见到,个人认为对以后遇到此类情况的兄弟具有参考价值.有必要做一个简单的分析记录. 在此次的分 ...
- 老李案例分享:Weblogic性能优化案例
老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...
- 性能调优案例分享:Mysql的cpu过高
性能调优案例分享:Mysql的cpu过高 问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务 ...
- 老李案例分享:MAT分析应用程序服务出现内存溢出过程
老李案例分享:MAT分析应用程序服务出现内存溢出过程 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loa ...
- 老李案例分享:定位JAVA内存溢出
老李案例分享:定位JAVA内存溢出 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loadrunner的培 ...
随机推荐
- Unity Shader模板测试-描边
Unity Shader模板测试描边效果,常用于 rpg 项目中主角被遮挡的情况,将被遮挡的部分的轮廓描边绘制出来,这样可以在任何情况都能知道主角在哪里.(还有另外一种就是使用X光效果,但这种效果不需 ...
- 画个Shape留意到的东西
这几个知识点 在 CoreGraphics 框架中有这样一个方法: public func addArc(center: CGPoint, radius: CGFloat, startAngle: C ...
- DNS滥用如何进行防范?
在当今数字化浪潮汹涌的时代,域名系统宛如互联网的基石,稳稳承载着将人们日常使用的便捷域名,精准转换为计算机能够识别与处理的IP地址这一关键任务.其重要性不言而喻,然而,随着DNS在全球范围内的广泛普及 ...
- 什么情况下会触发 Java 的 Full GC?
什么情况下会触发 Java 的 Full GC? Full GC(完全垃圾回收)是 Java 中的一个重要垃圾回收阶段,它会回收 整个堆内存,包括 新生代 和 老年代.触发 Full GC 的条件通常 ...
- kubernetes dashboard web控制台调研
背景 kubernetes 是目前最流行的容器化系统,管理的方式一般都是最基础的kubectl命令客户端进行管理,但是对与一些没有基础的研发人员并不是很友好,所以我们需要一些web控制台,类似于云厂商 ...
- 让IE6、IE7、IE8支持CSS3的圆角、阴影样式-最好的插件
想做个页面用到css3的圆角和阴影效果,但ie浏览器不支持,之前也听说有插件可以实现,周六在网上找到了一个方法,原文如下: 但凡是前端工程师,都知道IE6,IE7,IE8不支持.或者不完全支持CSS3 ...
- 关于:win远程桌面连接命令怎么用
远程桌面连接命令怎么用? 事实上,远程桌面连接命令很简单,一个mstsc命令就搞定: 也可以直接使用第三方远程桌面管理软件,比如 IIS7远程桌面管理 这些,但是想要真正连接上远程桌面是有前提的,下面 ...
- C#基础——不可变集合
参照:https://mp.weixin.qq.com/s/NFBc2bNeHpdadh89T44Lpg 在 .NET Core 中就存在着这三大 IReadOnlyList,IReadOnlyDic ...
- Vue计算属性computed与监听器watch
Vue计算属性computed与监听器watch 诞生原因:在模板中放入太多的逻辑会让模板过重且难以维护,比如 对后台插入地数据进行切割重组 <div id="example&quo ...
- Windows 实用工具(新机、全新系统、重装系统必备)
Windows 实用工具 https://www.lanzoub.com/b0ziu7owh 密码:akoc HEU_KMS_Activator Windows 激活工具. 下载链接: Github: ...