`
Return_values
  • 浏览: 5660 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

ORA-4031错误深入解析

阅读更多

想要彻底理解4031错误发生的原因就要了解SQL语句的执行过程以及Oracle共享内存的结构



             
客户端与Oracle之间通信过程图

 

客户端输入sql语句,sql语句通过网络到达数据库实例,server process接受sql语句。Server process接受到SQL语句后将sql语句解析成执行计划,然后才能执行。

需要说明的是在将SQL语句解析成执行计划的过程中会消耗计算机大量CPU资源因此就会产生一个问题,例如:

A用户执行一个SQL语句解析换成执行,B用户也有可能执行同样的SQL。如何才能高效利用CPU资源,不去做重复的解析工作呢?

 

因此就诞生了shared poolshared pool就是SGA中用来缓存SQL语句以及对应解析出的执行计划的一片内存区域。



                     
Oracle实例管理

 

这里结合Oracle实例管理的这张图对上面一幅客户端与Oracle之间会话通信的过程进行简单的解释说明:

  1. 首先客户端会在同Oracle实例间建立的连接池当中的众多连接中选择一条空闲的连接传输SQL语句(server process是服务器进程,可以连接到Oracle实例,在用户建立会话时启动 )。
  2. Server Process首先会先去shared pool中查找是否已经有了该条SQL语句对应的已缓存的执行计划,如果有直接执行(该种SQL解析也叫作软解析)。如果没有则会自己生成执行计划并缓存执行(该种解析也叫作硬解析)。
  3. 其中shared poolSGA(共享全局区)中的一部分内存资源,由所有服务器进程和后台进程共享。
  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 CacheRaw 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

 

 

  • 大小: 272.8 KB
  • 大小: 188.9 KB
  • 大小: 30.8 KB
  • 大小: 5.9 KB
分享到:
评论

相关推荐

    如何处理错误ORA-29275:部分多字节字符

    在深入探讨解决方案之前,我们首先需要了解ORA-29275错误的具体原因。这一错误的发生通常与以下因素有关: 1. **表中的VARCHAR2字段存储了多字节字符**:如果某个字段的数据类型为VARCHAR2,并且其长度限制不足以...

    ORA-12560 TNS 协议适配器错误

    - **检查tnsnames.ora文件**:这是客户端用来解析服务器地址的配置文件,确保其中的配置信息准确无误是非常重要的。 - **使用net config listener命令**:在服务器端执行此命令可以显示监听器的配置信息,有助于发现...

    OGG之ORA-01403案例

    本文将对 OGG 之 ORA-01403 案例进行详细的分析,包括出现错误的原因、解决方法、handlecollisions 参数的解析和使用注意事项等。 一、错误原因分析 OGG 之 ORA-01403 案例中,出现了复制进程 abended 状态,报告...

    《转载》ora-00020超出最大进程数

    1. 错误分析:深入解析错误背后的机制和数据库内部的工作原理。 2. 故障排查步骤:如何通过SQL查询或Oracle提供的工具来检查当前的进程状态。 3. 解决方案实例:提供具体的SQL语句或操作步骤来解决问题。 4. 预防...

    数据恢复:被注入的软件及 ORA-600 16703 灾难的恢复.docx

    总结来说,处理ORA-600 16703这类错误需要深入理解Oracle数据库的内部工作原理,具备故障排查和数据恢复的专业知识。通过细致的分析、有效的恢复策略和及时的预防措施,可以最大程度地减少此类灾难性错误对业务的...

    解决ORA-01033 ORACLE 正在初始化或关闭

    在Oracle数据库管理中,遇到ORA-01033错误是较为常见的问题之一,该错误通常出现在数据库启动或关闭的过程中。ORA-01033错误的全称是“ORA-01033: ORACLE 正在初始化或关闭”,它表明Oracle实例可能没有正确启动或...

    ORA-01480STR 绑定值的结尾 Null字符缺失 的问题原因及解决办法

    在Oracle数据库操作中,"ORA-01480: STR 绑定值的结尾 Null 字符缺失"是一个常见的错误,通常与数据插入或更新时的格式问题有关。这个错误通常意味着在处理字符串数据时,Oracle无法找到预期的NULL终止符,这可能是...

    ORA-16038解决办法

    ### ORA-16038错误解析与解决办法 #### 错误代码与含义 在Oracle数据库管理中,ORA-16038错误通常表明数据库遇到了与重做日志(Redo Log)相关的严重问题。具体而言,此错误码意味着数据库在处理重做日志时遇到...

    oracle错误ora-00257解决办法

    为了更深入地理解这个问题,可以参考提供的“ora-00257.wrf”视频教程,它应该包含详细的步骤和屏幕截图,帮助你直观地解决问题。WebEx录制的屏幕分享也可以提供实时操作的演示,这对于初学者尤其有帮助。 在实际...

    如何解决Oracle 常见错误 ORA-04031(PDF)

    在深入探讨如何解决ORA-04031错误之前,我们需要先了解几个与共享池(`shared pool`)密切相关的Oracle实例参数: 1. **`SHARED_POOL_SIZE`**:此参数定义了共享池的总大小。可以设置为具体数值(例如1024),也可以...

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    为了解析这个问题,我们需要深入理解Oracle数据库的锁定机制、死锁的原因以及如何诊断和解决死锁。 首先,Oracle数据库使用多粒度锁定(Multigranularity Locking,MGL)机制,提供行级、块级和表级的锁定。当事务...

    Oracle导dmp出现文件ORA-12154 TNS 无法解析指定的连接标识符解决方案

    在进行Oracle数据库的操作时,经常会遇到“ORA-12154 TNS 无法解析指定的连接标识符”这样的错误提示。此问题通常发生在尝试从客户端连接到Oracle数据库服务器时,特别是当执行数据导入导出操作时。本文将深入探讨该...

    常见Oracle错误都在这了! ORA-00257/ORA-00313/ORA-28000/ORA-28000

    本文将深入解析四个常见的Oracle错误:ORA-00257、ORA-00313、ORA-28000以及ORA-28000。这些错误可能在数据库运行过程中遇到,了解它们的原因和解决方案对于DBA(数据库管理员)来说至关重要。 1. ORA-00257:空间...

    Oracle错误代码及解决方法

    本资料主要聚焦于Oracle错误代码的解析及其对应的解决方法,帮助用户理解并解决Oracle数据库遇到的问题。 1. 错误代码的基本构成:Oracle错误代码通常由两部分组成,即错误号(Error Number)和错误消息(Error ...

    Oracel 错误码查询

    以上仅为部分Oracle错误码的解析,针对每个具体的错误码,建议结合Oracle官方文档和其他资源进行深入研究。通过理解这些错误码背后的逻辑,可以帮助开发者和DBA更有效地诊断问题并采取适当的措施解决问题。

    oracle错误一览表

    本文将深入解析部分常见Oracle错误代码及其含义,帮助数据库管理员和开发人员理解并解决这些问题。 ### ORA-00001: 违反唯一约束条件 当尝试插入一个已经存在的唯一值到一个具有唯一性约束的列中时,会触发ORA-...

    Oracle数据库共享池空间管理调优.pdf

    通过深入理解共享池的内部机制,定期进行性能监控和调整,可以有效避免ORA-4031错误,确保数据库的高效稳定运行。同时,与应用开发人员紧密合作,优化SQL语句和PL/SQL代码,也是提高数据库性能的重要手段。

    oracle 数据库错误一览表

    这篇内容将深入解析Oracle数据库的一些常见错误及其解决方案。 一、ORA-00001:唯一性约束违反 这个错误通常发生在尝试插入或更新数据时,违反了唯一性约束,如主键或唯一索引。解决方法包括检查插入的数据是否已...

    ORA-12154:TNS:无法解析指定的连接标识符

    "ORA-12154:TNS:无法解析指定的连接标识符"是一个常见的Oracle数据库连接错误,通常发生在尝试连接到Oracle数据库时。这个错误表明客户端无法找到或解析网络服务名(Net Service Name)来建立与服务器的连接。下面...

Global site tag (gtag.js) - Google Analytics