无微不至:调整_lm_cache_res_cleanup解决Shared Pool 的4031问题


李真旭(Roger)

云和恩墨西北区技术总监

Oracle ACE, ACOUG 核心会员

前不久某客户的一套核心数据库(10.2.0.4.12),据说每间隔一段时间就必须重启,因为会报ORA-04031 错误。

查询发现 shared pool 差不多 5G 的样子,其实 ges resource 消耗了差不多 3.5G shared pool 内存,也确实有些离谱了。

我们可以看到,ges resource 消耗的内存确实非常高。那么这里为什么 ges resource 消耗的内存这么高呢?

通过检查 v$resource_limit 发现存在有些异常,如下所示:

我们可以发现,ges_cache_ress 的 max 和 current 都很大,大的超乎想象。从现象来看,可以大致判断是 shared pool 中 cache 的 ges resource 没有及时回收,导致 ges resource占据的内存比较大。

想到这里,我心中产生了一个疑问,是否 Oracle 有相关隐含参数来控制这个资源回收的机制呢?我们知道 Oracle 通常都是这么干的,通过隐含参数来控制某项功能或机制。

搜下发现了2个相关的 bug,确实可能出现 ges resource 消耗内存很高的情况,最后产生ora-04031错误。

其中文档中提到了一个参数 _lm_cache_res_cleanup;通过调整该参数,来该表 ges resource 的回收机制;有可能避免这个情况。

方法好用不,要试试才知道,果断告知客户进行调整,然后观察几天后,发现 ges resource 的内存消耗得到了有效控制:

在未调整参数之前,重启实例1天,ges resource 就超过 300M了,然后逐渐攀升,直至出现问题。

备注:  bug 9026008,bug 10042937 跟该参数有关系,影响版本为11.1,11.2部分版本,大家可以阅读下。

总结:Oracle数据库的精细程度往往超越了大家的经验,几乎每一个微小的功能都存在着控制参数,遇到问题时,仔细分析,深入细节,最后从源头解决问题,是Oracle DBA的必备素质


本文出自数据和云公众号,原文链接

时间: 2025-01-21 18:59:57

无微不至:调整_lm_cache_res_cleanup解决Shared Pool 的4031问题的相关文章

oracle中通过调整_lm_cache_res_cleanup解决shared Pool问题

前不久某客户的一套核心数据库(10.2.0.4.12),据说每间隔一段时间就必须重启,因为会报ORA-04031错误.查询发现shared pool差不多5G的样子,其实ges resource消耗了差不多3.5G shared pool 内存,也确实有些离谱了. SQL> c/gcs/ges   1* select * from v$sgastat where name like 'ges%' SQL> /   我们可以看到,ges resource消耗的内存确实非常高.那么这里为什么ges

共享池的调整与优化(Shared pool Tuning)

--======================================= -- 共享池的调整与优化(Shared pool Tuning) --=======================================       共享池(Shared pool)是SGA中最关键的内存片段,共享池主要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成.其中库缓存的作用是存 放频繁使用的sql,pl/sql代码以及执行计划.数据字段缓存用于缓存数据字典.在内存空间有限的容量下

oracle中Shared pool深入分析及性能调整

摘要:本文首先详细介绍了oracle中shared pool的概念以及所包含的内存结构.然后深入介绍了oracle对于shared pool的管理机制.最后全面介绍了有关buffer cache监控以及调优的实用方法. 1. shared pool的概念 oracle数据库作为一个管理数据的产品,必须能够认出用户所提交的管理命令(通常叫做SQL语句),从而进行响应.认出的过程叫做解析SQL语句的过程,响应的过程叫做执行SQL语句的过程.解析的过程是一个相当复杂的过程,它要考虑各种可能的异常情况,

shared pool 调整

SQL>  select shared_pool_size_for_estimate spsfe,  2  shared_pool_size_factor spsf,  3  estd_lc_size els,  4  estd_lc_memory_objects elmo,  5  estd_lc_time_saved elts,  6  estd_lc_time_saved_factor eltsf,  7  estd_lc_memory_object_hits elmoh  8* from

shared pool 深度解析1+

原文整理自网络 1. 深入Shared Pool   Oracle数据库作为一个管理数据的产品,必须能够认出用户所提交的管理命令(通常叫做SQL语句),从而进行响应.认出的过程叫做解析SQL语句的过程,响应的过程叫做执行SQL语句的过程.解析是一个相当复杂的过程,它要考虑各种可能的异常情况,比如SQL语句涉及的对象不存在.提交的用户没有权限等.而且,还需要考虑如何执行SQL语句,采用什么方式去获取数据等.解析的最终结果是要产生Oracle自己内部的执行计划,从而指导SQL的执行过程.可以看到,解

shared pool 深度解析3(subpool)+

我们知道,从Oracle 9i开始,Shared Pool可以被分割为多个子缓冲池(SubPool)进行管理,以提高并发性,减少竞争. Shared Pool的每个SubPool可以被看作是一个Mini Shared Pool,拥有自己独立的Free List.内存结构以及LRU List.同时Oracle提供多个Latch对各个子缓冲池进行管理,从而避免单个Latch的竞争(Shared Pool Reserved Area同样进行分割管理).SubPool最多可以有7个,Shared Poo

关于shared pool的深入探讨(六)

关于shared pool的深入探讨(六) 原文链接: http://www.eygle.com/internal/shared_pool-6.htm 研究了几天shared pool,没想到忽然就撞到问题上来了.作为一个案例写出来给大家参考一下吧. 问题起因是公司做短信群发,就是那个18万买的4000字的短信小说.群发的时候每隔一段时间就会发生一次消息队列拥堵的情况在数据库内部实际上是向一个数据表中记录发送日志. 我们介入来检查数据库的问题,在一个拥堵时段我开始诊断: SQL> select

关于shared pool的深入探讨(一)

关于shared pool的深入探讨(一) link: http://www.eygle.com/internal/shared_pool-1.htm 关于shared pool的设置一直是一个争议较多的内容.很多文章上说,shared pool设置过大会带来额外的管理上的负担,从而在某些条件下会导致性能的下降. 那么这个管理上的负担指的是什么内容呢?本文对这个内容作一定的深入探讨.本文只涉及一个方面,后续的文章将从其他方面继续讨论. 基础知识: 我们可以通过如下命令转储shared pool共

shared pool latch/ library cache latch /lock pin介绍

latch:library cache --desc v$librarycache; latch:library cache用于保护hash bucket. library cache lock保护HANDLE. library cache pin保护library cache object--LCO. 从10G开始,library cache lock和library cache pin被MUTEX部分取代.暂时不讨论MUTEX. latch:library cache的数量: SYS@ by