ORA-04031:unable to allocate %S bytes of shared memory

ORA-04031错误unable to allocate %S bytes of shared memory,它是Oracle在没有足够的连续空闲空间分配给Shared Pool或者Large Pool时抛出的错误。当04031错误提示是Shared Pool无足够连续内存可分配时,有可能是由于Shared Pool不足或者Shared Pool中严重的碎片导致的。

(1)原因一:代码中存在硬编码

应用程序中存在未使用绑定变量的语句,导致大量的硬解析。

【检查方法】

执行以下SQL语句找出未使用绑定变量的语句:

SQL>SELECT substr(sql_text, 1, 50),COUNT(*)

FROM v$sqlarea

GROUP BY substr(sql text, 1, 50)

HAVING COUNT( ) ) > 10

ORDER BY COUNT(*) DESC;

这里,蓝色的50表示一个SQL语句至少前50个字符是相同的,蓝色的10表示前50个字符相同的SQL语句至少有10条以上。满足这样条件的SQL语句就有可能是未使用绑定变量。现场可根据应用的特点,调整50和10为其他数值。

【处理方法】

如果已经发生了ORA-04031错误,并且在服务器端可以执行sqlplus / as sysdba连接数据库,那么执行以下语句来清除共享池中的内容,释放碎片。

SQL> alter system flush shared pool;  生产上不要轻易执行

但是,如果服务器端执行sqlplus / as sysdba时都收到ORA-4031的错误,那么只能重启数据库,严重的情况下或者条件允许,就重启操作系统。以上方法仅是临时处理方法,只有将以上发现的未使用绑定变量的SQL语句反馈给研发人员并作出处理后,才可彻底解决此问题。


版权声明:本文为weixin_41786256原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。