咨询热线: 13764045638 7 x 24 在线支持!

ORACLE数据库经典 ORA-4031错误分析

ORACLE数据库经典 ORA-4031错误分析

当试图在共享池中分配大块连续内存而失败时,Oracle会首先从池中清理当前不用的对象从而使得空闲内存碎片(chunk:内存块)得以合并。如果这样仍然没有足够大的单个chunk来满足分配需要,则会产生ORA-04031报错。有许多ORA-04031错误直接原因都是由于共享池的大小或调整不当造成的。

 

Note:报ORA-4031错误的进程并不总是内存消耗的元凶。错误的发生仅是因为此进程无法得到所需内存而造成的。

 

如果已经按所有步骤正确设置了共享池大小(SHARD_POOL_SIZE) , 但此问题仍然产生时,除了从应用(例如:使用绑定变量查询替代静态SQL等)入手进行分析解决问题外,也可从其他trace文件中获得共享池的一些快照信息==>

 

修改init.ora参数文件,增加以下事件以从追踪文件中获取相关问题信息:

event = "4031 trace name errorstack level 3"

event = "4031 trace name HEAPDUMP level 3"

 

注意:除非重启实例,否则这个参数文件设置不会起效。从Oracle 9.2.0.5版本起,除了在请求heapdump时使用level 1,2,3 或32 你同样可以使用相同等级并加值536870912.这样将会在此等级上再进一步显示5个最大的subheaps同时每个subheap下显示相关5个最大的heap areas.

如果问题可以重现,则可在执行有问题的SQL语句前,在会话级别对事件进行设置:

SQL> alter session set events '4031 trace name errorstack level 3';

SQL> alter session set events '4031 trace name HEAPDUMP level 536870914';

 

Level 536870912 转储5个最大subheaps并且对应每个subheap将显示其5个最大heap areas。由于ORA-04031错误可能在不同池中发生(共享池,大池,java池,流池等),其level值的设置可参照如下:

 
 
Component
Level
PGA
1
SGA
2
Large Pool
32
Streams Pool   
64
Java Pool      
128

 

Note:  如果4031错误出现频繁,在实例级设置此事件(heapdump 536870914)将会产生许多大的trace文件.  这不仅会影响数据库性能而且可能使数据库挂起 (某些情况下可能会使得数据库崩溃).  因此有必要及时使用以下语句关闭此事件追踪:

 

alter system set events '4031 trace name HEAPDUMP off';

 

我们也通过Library cache转储来帮助确认产生ora-4031问题的游标:

 

sqlplus / as sysdba

SQL> oradebug setmypid

SQL> oradebug unlimit

SQL> oradebug dump library_cache 10

 

请注意:在Oracle 9.2.0.5+, 10g和11g版本中,4031 trace文件默认会在ORA-4031发生时产生并存放于user_dump_dest目录。如果你的数据库版本是其中的一个,那么你就不需要进行相关设置来生成4031 trace 文件。

 

ORA-4031 诊断 à

  • 检查Alert日志并查看错误是否记录。注意不是所有ORA-4031错误都会记录在alert日志中。
  • 如果错误被记录,请检查SGA的哪部分收到此错误。是共享池,大池,java池或streams池?
  • 查询v$sgastat以检查是否有组件表现出非正常增长.
  • 查询v$librarycache并检查:

- 有无无效对象 (多为DDL语句)

- 有无重载 (Library cache可能不够大)

- 内存命中率 (低命中率可能是非共享游标造成的)

  • 检查是否存在高Version Counts的游标。 可通过v$sql_shared_cursor查询. 如果存在某父游标下有许多子游标的情况,检查不可共享的原因. 大量子游标会加快共享池的碎片化. 请确认应用正在使用绑定变量方式查询.

 

更多信息,请看:

Ø  NOTE:146599.1 - Diagnosing and Resolving Error ORA-4031

Ø  Note:396940.1 - Troubleshooting and Diagnosing ORA-4031 Error

Ø  Note:554521.1 - ORA-4031 QUICK FIX - What to look for and what to do!

Ø  Note:430473.1 - ORA-4031 Common Analysis/Diagnostic Scripts