ORA-4031错误深入解析

想要彻底理解4031错误发生的原因就要了解SQL语句的执行过程以及Oracle共享内存的结构
图片描述
客户端与Oracle之间通信过程图
客户端输入sql语句,sql语句通过网络到达数据库实例,server process接受sql语句。Server process接受到SQL语句后将sql语句解析成执行计划,然后才能执行。
需要说明的是在将SQL语句解析成执行计划的过程中会消耗计算机大量CPU资源因此就会产生一个问题,例如:
A用户执行一个SQL语句解析换成执行,B用户也有可能执行同样的SQL。如何才能高效利用CPU资源,不去做重复的解析工作呢?
因此就诞生了shared pool,shared pool就是SGA中用来缓存SQL语句以及对应解析出的执行计划的一片内存区域。
图片描述
Oracle实例管理
这里结合Oracle实例管理的这张图对上面一幅客户端与Oracle之间会话通信的过程进行简单的解释说明:
1. 首先客户端会在同Oracle实例间建立的连接池当中的众多连接中选择一条空闲的连接传输SQL语句(server process是服务器进程,可以连接到Oracle实例,在用户建立会话时启动 )。
2. Server Process首先会先去shared pool中查找是否已经有了该条SQL语句对应的已缓存的执行计划,如果有直接执行(该种SQL解析也叫作软解析)。如果没有则会自己生成执行计划并缓存执行(该种解析也叫作硬解析)。
3. 其中shared pool是SGA(共享全局区)中的一部分内存资源,由所有服务器进程和后台进程共享。
4. Buffer Cache也是SGA中的一块区域,用来缓存Data files中取出的数据,如果没有buffer cache的话那么每次访问数据的时候都需要消耗I/O。
5. 所以当执行一个SQL语句对应的执行计划要访问数据,server process会先进入buffer cache找是否有所需要的数据,如果有就直接取出返回没有才会去Data files去取并将其先放入buffer cache中,并在其中对数据进行修改。之后再通过物理I/O写回到Oracle的数据文件中去。
6. 在对数据进行修改的同时会向SGA中另一块内存区域叫作Redolog Buffer中写入相关的日志信息。之后再写回到Oracle的日志文件中区。
7. 将返回的数据或信息通过连接返回给客户端。

上述过程中可以看出共享池是SGA中一块核心的内容,经典的Oracle4031错误也与这一块内存区域有密切的关系。
图片描述
Free Cache:
顾名思义就是shared pool中的一块空闲的内存区域。

Library Cache(库缓存):
主要缓存的是SQL语句,以及SQL句解析出来的执行计划。

Raw Cache (字典缓存):
Oracle数据库的自身信息都存储在数据字典中(比如说:数据库中有多少表,有多少用户,表中有多少列每个表多大等等)

Shared Pool主要的三块空间中一般Free Cache 和 Library Cache较容易有问题。我们可以整体上设置Shared Pool的大小但不能控制当中的Library Cache和Raw Cache的大小。
需要理解的是,Free Cache并不是一个大块连续的内存空间而是一个个内存块通过chain链将其链接如下图所示
图片描述
图中橙色的圆代表一个个内存块在Oracle中称之为chunk,而这些chunk会根据大小的不容被归类挂载一条条chain上,从下往上越来越大。

在这里举个例子:
如果有一条SQL语句解析出来大小为10K,那么就在第8K-12K的内存链上找比如找到一个11K的块那么就将其中的10K丢到Library Cache中,而剩下的1K再挂到相应的空间链里面去。这就是Free空间的内存组织情况。

这里需要特别提醒强调的是——什么时候需要在Free空间你面找chunk?答案是在执行硬解析的时候。

由此可见当有大量硬解析的时候,除了要去Free空间中找chunk还会产生大量的小碎片,于是就有可能产生这种情况,及有大量足够的Free空间但是被分割成很多小的碎片,没有适合可用的内存块。这种情况便会产生Oracle经典的4031报错。

总结一下Oracle产生4031错误的背景条件:
1. 大量的硬解析产生了很多小碎片
2. 产生了大量的小碎片后突然来了一条大的SQL语句需要解析。

本文原创首发于Cobub官网博客,作者:钟泽
如有转载请注明作者和出处!
推荐一款开源私有化部署的移动应用数据统计分析系统Cobub Razor
项目地址:https://github.com/cobub/razor
官网:www.cobub.com
开源社区技术交流QQ群:194022996

如何解决ora-4031错误 ora04031 oracle的错误解决方法 立即下载

相关推荐

告别云端依赖:手把手教你在Windows 10/11上离线部署WhisperDesktop(含模型下载避坑指南)

本文详细介绍了如何在Windows 10/11上离线部署WhisperDesktop,包括硬件要求、模型下载、环境配置和实战应用。通过本地部署,用户可以实现高效的语音转文字功能,无需依赖云端服务,特别适合注重数据隐私和需要离线工作的场景。

weixin_33736048的博客 322

ora-4031原因和解决方法

前天,发现一个10g数据库出现ora-4031错误。 4031错误产生原因 当尝试在共享池分配大块的连续内存失败(很多时候是由于碎片过多,而并非真是内存不足)时,Oracle首先清除共享池中当前没使用的所有对象,使空闲内存块合并.如果仍然没有足够大的单块内存可以满足需要,就会产生ORA-04031错误. 1、Oracle的bug 2、没使用绑定变量,sql没有足够的共享,产生大量不必要的解

huoshuyinhua的专栏 4195

ICCompiler II实战:从NDM生成到APR流程的完整避坑指南

本文是一份针对ICCompiler II(ICC II)后端物理实现流程的实战避坑指南。文章详细解析了从NDM库生成、设计初始化、布局规划到时钟树综合与布线的完整APR流程,重点分享了各环节的常见陷阱、精细化配置命令与调试经验,旨在帮助工程师高效达成PPA目标,确保设计一次成功。

p4q5r6s7t的博客 533

ORA-4031错误

1. ORA-4031错误的原因,一般是大量的hard parse导致了shared pool中的free list中产生大量的内存小碎片,当一个需要很大内存来进行hard parse的sql语句到来时,无法从free list中找到内存,即使进行内存的释放,还是不能找到符合的内存块。从而报ORA-4031错误。2. ORA-4031错误的解决方法:1)alter syste...

weixin_34301307的博客 311

瑞芯微RK3568开发板实战:Android11系统parameter.txt文件配置全解析(附常见问题排查)

本文深入解析了瑞芯微RK3568开发板在Android 11系统下parameter.txt文件的配置要点与实战技巧。作为BootLoader启动阶段的核心蓝图,该文件决定了硬件初始化、分区布局及电源管理。文章详细拆解了身份标识、GPIO控制(PWR_HLD)、命令行参数及分区表等关键字段的配置逻辑,并针对RK3568平台与Android 11特性提供了专项适配策略,最后附带了启动失败、分区异常等常见问题的深度排查方法。

php55的博客 895

Syzkaller实战教程2:运行环境配置+实例运行

本文详细介绍了在linux系统上搭建Syzkaller内核模糊测试环境的完整流程。 1.环境配置:通过VMware创建Ubuntu20.04虚拟机A,配置QEMU/KVM虚拟化环境,安装Go语言工具链和Syzkaller; 2.内核编译:下载Linux内核源码并配置KCOV等调试选项,编译生成带覆盖率支持的bzImage内核镜像; 3.测试环境构建:使用debootstrap创建Debian虚拟机镜像,通过QEMU启动嵌套虚拟机B; 实例测试: 4.演示两种测试场景 - 提供完整上手教程

cuguanren的博客 1377

Oracle-解决ORA-4031错误

ORA-4031错误的原因: 通常是大量的hard parse导致了shared pool中的free list中产生大量的内存小碎片,当一个须要非常大内存来进行hard parse的sql语句到来时。无法从free list中找到内存,即使进行内存的释放。还是不能找到符合的内存块,从而报ORA-4031错误。 解决方法: 1.清空share pool alter system flush sha...

dbhang的博客 4201

计算机网络-自顶向下方法 第三章课后习题答案(第七版)

复习题 R1. a) 就叫这个协议为简单传输协议STP(Simple Transport Protocol)。在发送方,STP从发送进程接收不超过1196字节的数据块、目标主机地址和目标端口号。STP向每个块添加一个4字节的头,并将目标进程的端口号放在头中。STP然后将目标主机地址和结果段提供给网络层。网络层将段交付给目的地主机的STP。目的主机基于STP检查段中的端口号,从段中提取数据,并将数据传递给由端口号标识的进程。 b) 在发送方,STP从发送进程接收不超过1192字节的数据块、目标主机地址和目标端

Erekilu的博客 2万+

ORA-4031

经典的Oracle4031错误也与share pool密切的关系。Library Cache(库缓存):主要缓存的是SQL语句,以及SQL句解析出来的执行计划。Data Dictionary Cache (字典缓存):Oracle数据库的自身信息都存储在数据字典中(比如说:数据库中有多少表,有多少用户,表中有多少列每个表多大等等)Result Cache:用于存储和检索高速缓存的结果。

qq_58503141的博客 1326

Atlas 300I Pro推理卡性能深度测试:对比业界同类产品的能效比与算力表现

本文对昇腾Atlas 300I Pro推理卡进行了深度性能评测,重点对比了其与业界同类产品的能效比与算力表现。实测数据显示,该卡在运行BERT等模型时展现出高达39.6句子/秒/瓦的卓越能效比,电力成本可降低40%以上,同时其达芬奇架构和硬件加速特征检索能力,为高密度在线推理和向量检索场景提供了强大支撑。

weixin_29031161的博客 579

2026年GESP3月认证C++五级真题解析

因为要合并成升序数组,所以当A[i]小于等于B[j]时,取A[i],否则取B[j]。当a[i]>a[j]时,左边数组中从i到m的所有元素都大于a[j],因此逆序对数量增加m-i+1。给定一个包含n个互不相同的正整数的数组A与一个包含m个互不相同的正整数的数组B,请你帮忙计算有多少个数在数组A与数组B中均出现。下面代码实现两个整数除法,其中被除数为一个“大整数”,用字符串表示,除数是一个小整数,用int表示,则横线处应该填写()。且a[i] > a[j],则a[i]和a[j]是一个逆序对。

lan_in的博客 119

共享池之十:模拟ORA-4031错误

ORA-4031错误 在报ORA-4031错误的时候,有可能使用下面的SQL语句查看,发现可用的内存还是足够大的,     SQL> select POOL,NAME,BYTES from v$sgastat where NAME='free memory';     事实上,在Oracle发出4031错误之前,已经释放了不少recreatable类型的chunk了,因此会产生很多可用内存

还不算晕的专栏 3028

【工业级视觉实战】海康威视SDK + Python + YOLOv11:零延迟目标追踪系统落地指南

要在 Python 中调用海康 DLL,首先得把 C++ 的结构体 1:1 翻译过来。这是很多开发者踩坑最深的地方(指针错误、内存溢出)。import sys# 根据操作系统加载库else:# 定义设备信息结构体 (对应 C++ LPNET_DVR_DEVICEINFO_V30)("sSerialNumber", ctypes.c_byte * 48), # 序列号("byAlarmInPortNum", ctypes.c_byte), # 报警输入个数。

BUG猿的博客 227

转载 -ORA-4031错误深入解析

文章转自:https://blog.youkuaiyun.com/guoyjoe/article/details/8567087ORA-4031错误深入解析ORA-4031错误时,我们通常可以根据Oracle无法分配多少字节的内存,来判断共享池碎片的严重程度,以下是4031错误官方的解释:[oracle@guoyj ~]$ oerr ORA 403104031, 00000, "unable to alloc...

Babyfatliang的博客 1103

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

全面解析ORA-4031错误

  报ORA-4031错误时,我们通常可以根据Oracle无法分配多少字节的内存,来判断共享池碎片的严重程度,以下是4031错误官方的解释:   [oracle@guoyj ~]$ oerr ORA 4031 oracle培训...

cuisuoju4801的博客 485

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

第四讲--shared pool内存块组成结构及4031错误产生原因分析

我们只能设置shared pool的大小,不能设置里面librarycache和row cache的大小。   Free的内存结构: Free空间由一个个小的内存块(chunk,图中圆圈)组成,然后用链(chain)把内存块挂到链上。图中所示的三个链由上到下所挂的内存块的大小越来越大。 硬解析时根据SQL执行计划的大小,从free区中分配合适的内存块给执行计划,并把内存块移到l

chengonghao的博客 864

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Scripts--查看ORA-4031出现的次数及需要分配空间的大小

ORA-4031这个出错信息是在client才会出现的。不会记录在alert.log中,但是有的时候会在udump中也会留有一些信息。出现4031的类别有很多种,可以查看 x$ksmsp.ksmchcls 这个列得到。下面提供的...

cuifan5176的博客 122

重庆思庄技术分享-ORA-4031 错误是什么?

duanweifang的博客 9

oracle11 share pool,转: 关于share pool的作用简单解释

引子:一个错误的出现ORA-4031 cannot allocate memory of xxxx bytes(share pool)简单解释:(来源与网上文章,相关数据和使用方法后期查证后一起添加)该错误是指在共享池当中无法分配xxxx字节的内存。共享池是用于存储应用程序的SQL源代码及其相关解析代码和执行计划的,如果无法分配内存空间,当然就会影响应用系统。关于在主机上查看share pool配...

weixin_33835155的博客 520

ORA-04031: unable to allocate 32 bytes of shared memory

一、查错误代码含义 [oracle@oracle trace]$ oerr ora 04031 04031, 00000, “unable to allocate %s bytes of shared memory (”%s","%s","%s","%s")" // *Cause: More shared memory is needed than was allocated in the sh...

qq961573863的博客 2201
上一篇: Hadoop Yarn调度器的选择和使用
下一篇: ORA-4031错误深入解析
return_values
博客等级 码龄10年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值