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语句反馈给研发人员并作出处理后,才可彻底解决此问题。