ORA-27301 OS failure message Resource temporarily unavailable错误
Jul132015
加班到凌晨3点给开发人员迁移了UAT数据库,之前的UAT数据库和其他数据库是放到同一台主机上的,这台主机是同时运行4个单实例数据库,资源不足,主机响应很慢,后申请独立的主机,将UAT数据库迁移到一台24核64G内存的独立好主机上。操作系统CentOS 5.11,数据库版本11.2.0.4.0。
迁移之后,数据库都运行正常,在快到中午的时候,发现有个业务用户被锁,我在监视监听日志的时候发现如下报错:
msg time='2015-07-10T11:11:29.116+08:00' org_id='oracle' comp_id='tnslsnr' type='UNKNOWN' level='16' host_id='SL010A-IVOD01' host_addr='10.0.97.34' TNS-12518: TNS:listener could not hand off client connection TNS-12536: TNS:operation would block TNS-12560: TNS:protocol adapter error TNS-00506: Operation would block Linux Error: 11: Resource temporarily unavailable
观察告警日志也发现一堆这个错误:
Fri Jul 10 12:14:51 2015 Process J000 died, see its trace file kkjcre1p: unable to spawn jobq slave process Errors in file /data/u01/oracle/diag/rdbms/ivldb/uatdb/trace/uatdb_cjq0_2411.trc: Process startup failed, error stack: Errors in file /data/u01/oracle/diag/rdbms/ivldb/uatdb/trace/uatdb_psp0_848.trc: ORA-27300: OS system dependent operation:fork failed with status: 11 ORA-27301: OS failure message: Resource temporarily unavailable ORA-27302: failure occurred at: skgpspawn3 Process J000 died, see its trace file kkjcre1p: unable to spawn jobq slave process Errors in file /data/u01/oracle/diag/rdbms/ivldb/uatdb/trace/uatdb_cjq0_2411.trc: Process startup failed, error stack: Errors in file /data/u01/oracle/diag/rdbms/ivldb/uatdb/trace/uatdb_psp0_848.trc:
此时所有的远程连接以及无法访问数据库,经过查询,发现limit限制都正常,内存不足,交换分区已经使用近1GB,检查发现,oracle用户共有2573个进程,可是两个数据库(实例)的连接加起来还不足550个。
[oracle@SL010A-IVOD01 ~]$ ps -ef | wc -l 2573 [oracle@SL010A-IVOD01 ~]$ ps -ef | grep IFUAT | wc -l 44 [oracle@SL010A-IVOD01 ~]$ ps -ef | grep uatdb | wc -l 503
那么那两千个进程是什么?分析发现,crontab里有一堆的sh脚本,每分钟运行一次,通过sqlplus连接数据库调用存储过程,以下是这些进程的信息:
[oracle@SL010A-IVOD01 ~]$ ps -ef | grep cron | wc -l 405 [oracle@SL010A-IVOD01 ~]$ ps -ef | grep sqlplus | wc -l 394 [oracle@SL010A-IVOD01 ~]$ ps -ef | grep BT_FUL_PG_IF_FU | wc -l 401 [oracle@SL010A-IVOD01 ~]$ ps -ef | grep sendmail | wc -l 401
可见,服务器上有400个左右的crontab调用的进程,这400个crontab进程又调用了400个sqlplus访问数据库,这400个sqlplus进程又调用了400个存储过程相关的进程,然后crontab进程再掉sh脚本的时候由于没有重定向日志,又掉了400个sendmail进程将日志信息发给oracle操作系统用户。这样一来,就搞出来1600个进程。
后来,开发人员根据业务需求,将部分crontab改成5分钟运行一次,其他改成30分钟一次,问题解决。
【上一篇】ORA-02429 cannot drop index used for enforcement of uniqueprimary key错误
【下一篇】ORA-1652 unable to extend temp tablespace临时表空间无法自动扩展发现的奇葩设置
【下一篇】ORA-1652 unable to extend temp tablespace临时表空间无法自动扩展发现的奇葩设置