7 x 24 在线支持!
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