一、问题描述
什么是4031错误和4031错误产生的原因:
简单一个句话概括:
- 由于服务器一直在执行大量的硬解析,导致Oracle 的shared pool Free空间碎片过多,大的chunk不足, 当又一条复杂的sql语句要硬解析时, 缺少1个足够大的Free chunk, 通常就会报4031错误.
二、解决方法
临时解决推荐方法1,其他一般推荐方法4和5,大佬推荐方法2和3解决。
方法1.清空Shared pool缓存.
此方法治标不治本,以后还会报4031,可以再次清理shared pool解决
执行
alter system flush shared_pool;
方法2.共享SQL
这一块需要自己理解,我是根据学习了相老师讲解的方法,可以搜索一下共享sql减少硬解析的方法;
方法3. 将复杂sql语句及执行计划强制保留在缓存
dbms.shared_pool.keep('object_name')
此话怎么理解? 其实导致4031错误的原因是shared_pool空间没有足够大的chunk提供给新的复杂sql语句进行硬解析, 其实也不是单纯地因为free 空间碎片太多, 其实当free空空间没有足够大的chunk时, oracle 会释放 Library cache中長时间不使用的chunk.
举个例子, 1个数据库实例中, free空间中chunk数量很少了,而且没有足够大的chunk, 这时有1个中等规模的sql要硬解析,就会从library cache中找那些不长用的chunk释放出来, 如果释放里面若干个小规模的chunk, 是无问题的.
但是如果其中library cache 有个很大的chunk存放着1个很复杂的sql语句, 但是长时间没有被使用了, 有可能这个chunk被释放出来被使用, 而且被拆解了… 其中一部分别使用, 另1部分被放入free空间中.
而之后偏偏那个很复杂的sql语句又执行了,需要硬解析, 而那个足够大的chunk已被分解… 则有可能报403