数据库总喜欢在放假的时候出问题,上个周末一个CP方平台又毫不客气的当掉。以前这些事情有老大主动处理,现在只能指望自己了。
所有的业务程序提示错误是"ORA-24324: service handle not initialized",看来oracle服务挂了,到数据服务器上ps一下,发现还残留有几个oracle进程。用sqlplus连接失败,提示“ORA-04031: unable to allocate 4200 bytes of shared memory ("sharedpool","TRIGGER$","sga heap","state objects")”。执行svrmgrl打算用shutdown immediate强行中断oracle,居然无效。
好歹还有互联网可以用吧,得到以下参考文选:
看来很幸运,ORA-04031确实是个很常见的问题。根据提示在svrmgrl里用shutdown abort中断服务,再用startup启动oracle,短信平台暂时又正常运行了。不过这只是治标,我总得知道问题的原因吧。于是又找到以下文章:
http://afy.itpub.net/post/81/102599 这位先驱很详细的罗列了导致ORA_04031的几个原因。我对号入坐。
SQL> show parameter shared_pool_size;
查看到shared_pool_size=31457280,果然是默认的初始值。看来是因为shared_pool_size太小?那就来扩充吧。
SQL> alter system set shared_pool_size=100m scope=spfile;
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
这个参数不能修改?来看一下shared_pool_size参数的属性
SQL> select * from v$parameter where name ='shared_pool_size';
得到ISMODIFIED=false
看来是没指望通过sqlplus来修改这个参数了。好歹可以修改配置脚本吧?本数据库实例的配置脚本名字叫init*.ora,其中*用实例名替代
#locate init*.ora 找到配置文件,将其中的shared_pool_size = 104857600,保存。
通过svrmgrl重新启动oracle,shared_pool_siz新参数值生效
具体效果,有待继续观察。