株式会社コーソル

KNOWLEDGE

コーソルの技術情報

コーソルでは経験豊かなエンジニアが、Oracle Databaseに関するお役立ち情報を発信しています。
データベースのチューニングや設定にお役立ていただけます。

KNOWLEDGE検索人気のキーワード

Oracle DB Tips

ORA-04031: 共有メモリーの??バイトを割当てできません

01.ORA-04031エラーとはどのようなエラーか?

Oracleは処理を実行するに当たり、共有プールから処理に応じてさまざまなサイズのメモリ領域を取得します。
要求したサイズのメモリを共有プールから獲得することに失敗した場合、ORA-04031エラーが発生します。

02.ORA-04031エラーのエラー出力例

ORA-04031: 共有メモリーの4096バイトを割当てできません("shared pool",
"SELECT * from DUAL","sga heap(2,0)","library cache")

エラーの数値、引数の意味は以下のとおりです。

4096                    割当てを要求したメモリのサイズ(バイト)
"shared pool"           メモリを割り当てようとしたSGAのメモリ領域
"SELECT * from DUAL"    割り当てようとしたオブジェクトの内容
"sga heap(2,0)",        確保を試みたメモリ領域の場所
"library cache"         割当てを要求したメモリのタグ

03.ORA-04031の一般的な発生要因と対処

ORA-04031は一般に以下の要因で発生します。

  • 共有プールの断片化
  • 共有プールサイズが小さい
  • OracleのBug

 

共有プールの断片化

ORA-04031発生時の要求メモリサイズが小さい場合、共有プールの断片化が進展し、割り当て可能なメモリサイズが小さくなっていることが原因である可能性があります。
断片化を抑制するためには、以下のいずれかの対処を行ってください。

  • 定期的な ALTER SYSTEM FLUSH SHARED_POOL;の実行 (システムの負荷が低い時間帯に実行すべき)
  • ラージプールの構成
  • 予約領域 SHARED_POOL_RESERVED_SIZE の拡張

 

また、アプリケーションの修正が可能であれば、SQLをバインド変数化することで断片化をある程度抑制することができる場合がありますが、有効性は状況によります。

共有プールサイズが小さい

共有プールサイズが小さい場合は、共有プールの拡張を検討してください。
適切な共有プールサイズは、Databaseで実行する処理の内容に強く依存するため、一概にお伝えすることができませんが、通常は最低でも512MBを割り当てることが望まれます。可能であれば1GB以上のサイズを割り当ててください。
なお、自動SGA管理、自動メモリ管理を使用すると、共有プールが意図せず小さいサイズになることがあります。このような事態を回避するために、自動SGA管理、自動メモリ管理を使用している場合でも、初期化パラメータ shared_pool_sizeに共有プールの最小値を設定することをお勧めします。

OracleのBug

頻繁に確認される動作ではありませんが、メモリーリークなどのOracleのBugにより、ORA-04031が発生する場合もありえます。
断片化への対処を実行しており、かつ、十分なサイズの共有プールの割り当てている場合でも、ORA-04031が頻発する場合は、アラートログ、トレースファイルをOracle Databaseのサポート窓口に提示して調査を依頼してください。
または、可能であれば新しいPSR(Patchset Release)へのアップグレードも検討して下さい。Bugが修正されている場合もあります。

04.ORA-04031に関するFAQ

ORA-04031発生後に共有プールをflushすれば断片化は解消しますか?

ORA-04031発生の直前に、共有プールのflush(ALTER SYSTEM FLUSH SHARED_POOL;)相当の処理が内部的に実行されています。すなわち、ORA-04031が発生したということは、flush処理を実行しても、断片化が解消しなかったことを示しています。
このため、ORA-04031発生後に共有プールをflushしても断片化は解消しません。
断片化を予防したい場合は、定期的にALTER SYSTEM FLUSH SHARED_POOL;を実行してください。ただし、このコマンドはシステムに与える影響が大きいため、負荷の高い時間帯に実行することは絶対に避けてください。

自動SGA管理、自動メモリ管理を使用すればORA-04031を完全に予防できますか?

自動SGA管理、自動メモリ管理は共有プールサイズなどのSGAコンポーネントのサイズを自動的に調整する機能です。共有プールの使用状況に応じて共有プールのサイズ拡張などを実行することで、ORA-04031の発生を軽減する可能性がありますが、完全に予防はできません。
また、自動SGA管理、自動メモリ管理を使用すると、共有プールが意図せず小さいサイズになる場合があるようです。このような事態を回避するために、自動SGA管理、自動メモリ管理を使用している場合でも、初期化パラメータ shared_pool_sizeに共有プールの最小値を設定することをお勧めします。

05.キーワード

ORA-04031 ORA-4031 共有プール 断片化 ALTER SYSTEM FLUSH SHARED_POOL