故障处理:ORA-04031真实案例分享

news/2025/9/21 15:03:45/文章来源:https://www.cnblogs.com/www-htz-pw/p/19103682

我们的文章会在微信公众号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=0x6008bf00Type           Count             Sum         Average~~~~           ~~~~~             ~~~         ~~~~~~~perm               6        81833176     13638862.67free               5            8336         1667.20R-stopper               6             288           48.00R-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)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图解24:8种常用的缓存淘汰策略

最近都在开发AI集成项目,博客文章也试试AI特效处理,使用AI效果还可以,也可以做点水印,只是图片没有原图那么高清了

读书笔记:更智能的数据库索引:只关注你需要的数据

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…

JS设计模式-模块模式

模块模式好像不是经典的设计模式,但不可避免的每种编程语言都加入了模块的概念。有时候可能用了模块模式但并不知道自己用的是模块模式。虽然不是经典的设计模式,但是作为JS创建模块的一种模式也是经常被使用。这里对…

关于天猫精灵喵控的初步拆机研究

结论: 晶晨RTOS方案,有移植Linux可能 近期在pdd发现天猫精灵喵控这个天猫系的新品,和天猫精灵一样可以当语音助手用,还可以用作红外遥控器~ 到手真的是很小一个圆饼,却有着强大的功能。揭开背面防滑垫,拆开后盖。…

利用Burpsuite实现抓取https流量

Burpsuite官方下载地址: https://portswigger.net/burp/communitydownload一、访问burpsuite监听端口下载证书 确保浏览器已设置代理(这里我用Firefox浏览器示例)【一定要勾选“也将此代理用于HTTPS”】,并确保代理…

C++完全攻略:从新手到高手的编程进化之路 - 详解

C++完全攻略:从新手到高手的编程进化之路 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

02-Media-6-rtsp_server.py 使用RTSP服务器流式传输H264和H265编码视频和音频的示例程序 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:敏捷开发-Scrum(下)

深入解析:敏捷开发-Scrum(下)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

RTX4090双卡本地布署QwenImage模型并生成OpenAI API - yi

RTX4090双卡本地布署QwenImage模型并生成OpenAI API #新建man.py文件,加入代码from modelscope import DiffusionPipeline, FlowMatchEulerDiscreteScheduler, snapshot_download import torch import math import os…

Visual Studio 报错:“9_自定义命令”名称在默认命名空间“9_自定义命令”中无效。请更正项目文件中的 RootNamespace 标记值。

当修改项目文件名后,可能会遇到类似上面的报错,这时,需要在项目上点击右键,选择属性,在【默认名称空间】中,修改为程序中实际使用的名称空间(namespace)最后再保存就可以了。

ubuntu22.04下搭建iRedMail邮件服务器 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

图解23:datetime和timestamp的区别

除了之前开发国际化项目使用timestamp时区的特性,其他基本都是使用datetime

深入解析:SQL语句优化的步骤详解

深入解析:SQL语句优化的步骤详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

在Java中识别泛型信息

Java中泛型信息在编译时由于类型擦除的原因,通常是不可获取的。类型擦除是Java在编译泛型代码时采取的一种措施,用于保证新的泛型代码能与旧的非泛型代码兼容。它将泛型类型参数替换为它们的边界,如果类型参数是无边…

Kali Linux 光标与快捷键全攻略

Kali Linux 光标与快捷键全攻略1️⃣ 终端(Bash / Zsh / XFCE Terminal / GNOME Terminal) 光标移动快捷键 功能Ctrl + A 移到行首Ctrl + E 移到行尾Alt + B 向左移动一个单词Alt + F 向右移动一个单词Ctrl + B 向左…

图解22:扩展系统的最佳8种策略

进几年都是使用阿里云服务,扩展方面自己操心的也相对较少了

Winform项目添加WPF

#####愿你一寸一寸地攻城略地,一点一点地焕然一新#####

本地免费使用网页表格控件websheet

​ websheet本地localhost免费使用 代码样例地址: http://www.websheet.cn/xlsx/ 1.0.3 版本主要更新内容: 设置行隐藏下面代码隐藏第一行和第五行,行代码如下:let yourElement = document.getElementById(&quo…

图解21:Redis为什么这么快

使用AI处理了,看看豆包刚上线的4.0处理图片的能力,所以没有那么清晰了,原图是比较高清的, 其实看到一些项目,只用String类型