ORA-04031とは
ORA-04031とはSGA内の共有プールやラージプール等からメモリを割り当てることができなかった場合に発生するエラーです。
ORACLEのほとんどの処理では共有プールからのメモリ割り当てが必要になるためORA-04031が発生する状態ではデータベースへの接続さえできなくなる可能性があるため影響は非常に大きいといえます。
自然解消する場合もありますが、復旧優先であれば速やかにインスタンスを再起動したほうがよいでしょう。
対策
枯渇した領域が共有プールであれば共有プールを広げることで発生を防ぐことができますが、共有プール等の仕組みは内部的な仕様が多くあるためサポートサイトのナレッジベースの確認やサポートセンターへの相談等をお勧めします。
再現方法
以下のようにSGA上のカーソルを全てdbms_shared_poolプロシージャによりピンし、解放を禁止してしまうことで共有プール枯渇によるORA-04031を再現することができます。
conn / as sysdba
declare
i number;
j char(30);
sqlstr varchar2(100);
cursor cur_pin is
select rawtohex(address) || ',' || to_char(hash_value)
from sys.v_$sql where kept_versions=0;
rec_pin varchar2(1000);
begin
i :=1;
loop
loop
i := i+1;
exit when i mod 1000 = 0;
sqlstr := 'select ''' || i || ''' from dual';
execute immediate sqlstr into j;
end loop;
open cur_pin ;
loop
fetch cur_pin into rec_pin;
exit when cur_pin%notfound;
dbms_shared_pool.keep(rec_pin,'x');
end loop;
close cur_pin;
end loop;
end;
/