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的错误解决方法 立即下载

相关推荐

RAID 0/1/5/10 性能实测:4块 SATA SSD 组阵列,顺序读写速度对比

本文通过实测对比了RAID 0/1/5/10在4块SATA SSD上的顺序读写性能,详细展示了不同RAID级别的配置方法、理论性能与实际测试数据。测试结果显示,RAID 0在顺序读写速度上表现最佳,而RAID 10则在性能与数据安全之间取得了平衡,适合数据库服务器等关键应用场景。

weixin_33462167的博客 424

ora-4031原因和解决方法

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

huoshuyinhua的专栏 4195

EZ-USB-FX3 slavefifo调试

最近使用fx3-usb-3.0调试slave fifo的传输,期间遇到许多难以理解的问题。在这里分享给大家,希望可以少走一些弯路,我自己是这样走过来的。 1,首先去官网下载原始的参考设计,并安装所提供的SDK软件:FX3SDKSetup_1.3.4.exe 2,接着把参考设计文档AN65974阅读一遍,分别创建新的SDK工程和FPGA工程。如果使用的原厂的开发板,那么可以按照文档提示,可以很顺畅的跑完整过测试。否则需要匹配自己的硬件,做针对性的更改和移植,而我走的是后一条路,于是开始了漫长的调试之路。.

YDY5659150的专栏 3631

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

利用HTML+CSS设计PPT:html-to-pptx实现自动化转换与可编辑输出

在办公自动化和前端开发领域,将网页技术应用于文档生成是一个重要的技术方向。其核心原理在于通过解析HTML/CSS的结构与样式,将其映射为目标文档的原生对象模型。这项技术的价值在于,它能够将Web技术栈强大的布局与样式能力(如Flexbox、CSS Grid)与办公软件(如Microsoft PowerPoint)的广泛兼容性和可编辑性相结合。在实际应用场景中,这种技术特别适合需要快速生成兼具设计感与实用性的演示文稿,例如数据报告、产品发布和营销材料。本文探讨的html-to-pptx项目正是这一思路的工程实

weixin_30652491的博客 487

Oracle登录报错ORA-12560?5分钟搞定TNS协议适配器错误的完整修复指南

本文详细解析了Oracle登录报错ORA-12560(TNS协议适配器错误)的成因与解决方案。从基础服务检查到高级网络配置排查,提供了一套完整的修复流程,帮助数据库管理员快速解决连接问题,确保Oracle数据库的稳定运行。

weixin_29278805的博客 522

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

Python量化交易入门:天勤量化TqSdk保姆级教程(含避坑指南)

本文提供Python量化交易入门指南,重点介绍天勤量化TqSdk的使用方法,包括环境配置、核心API实战、策略开发技巧及实盘部署。教程涵盖中国期货市场,帮助个人投资者快速掌握量化交易技术,避开常见陷阱。

weixin_29065791的博客 836

ORA-4031

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

qq_58503141的博客 1326

CVPR2021 CenterPoint源码解读:从VoxelNet到两阶段优化的完整实现细节

本文深度解析了CVPR 2021 CenterPoint模型的完整实现细节,从VoxelNet体素化、稀疏卷积Backbone,到基于中心点的检测头与两阶段精修机制。文章提供了从环境搭建、数据预处理到核心代码模块(如热力图生成、关键点特征提取与MLP Refiner)的实战指南,并分享了训练策略、多任务损失调优及可视化调试等关键工程实践,助力开发者深入理解并复现这一高效的3D目标检测框架。

linux的博客 470

探索robotics-toolbox-python:从基础安装到高级机器人运动学应用

本文详细介绍了robotics-toolbox-python工具箱,从基础安装、环境配置到机器人运动学与动力学的核心应用。通过D-H参数、URDF导入和内置模型三种方式快速构建机器人模型,并演示了正逆运动学计算、关节空间与任务空间轨迹规划以及三维可视化仿真。该工具箱极大地简化了机器人算法开发流程,是进行机器人学研究和应用实践的强大工具。

i1j2k的博客 496

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

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

还不算晕的专栏 3028

【HAL库-STM】智能温控按键小风扇【胎教级教学】

硬件设备:DHT11,0.96寸oled屏,二/三/四线风扇(不挑),面包板 、f10的精英板等等。当人在的风扇面前时可以自行控制风扇,不在面前时又想开风扇就让他温控自行开启,(在这里有一个想法就是加上蓝牙和wifi控制的功能能够远程遥控,这个如果做的再全一点就要自主研发是一个多功能app,这里没有做。针对这个dht11,我一开始是卡在了这个check函数里面,一直是我给完dht11低电平和高电平后,dht11不回复我低电平和高电平,这个不是我的问题,当时代码是没毛病的,这个点一直卡着我。吐血五天实现小成品

weixin_52451652的博客 1741

转载 -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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

全面解析ORA-4031错误

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

cuisuoju4801的博客 485

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

chengonghao的博客 864

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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、付费专栏及课程。

余额充值