ORA-12537错误的解决
Author : rainnyzhong
Date: 2009-6-5
服务器配置:
DB VERSION:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi 专用服务器
OS: Linux ecv33.localdomain 2.6.9-55.ELsmp #1 SMP Fri Apr 20 16:36:54 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux
OS RAM:8G
症状描述:
用SQLPLUS连接DB报:
ERROR:
ORA-12537: TNS:connection closed
检查listener.log,看到很多如下错误:
05-JUN-2009 13:24:26 * (CONNECT_DATA=(SID=ORA33)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.17.16.234)(PORT=1487)) * establish * ORA33 * 12518
TNS-12518: TNS:listener could not hand off client connection
TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 32: Broken pipe
检查sqlnet.log,报很多类似如下的错误:
***********************************************************************
Fatal NI connect error 12537, connecting to:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.16.33)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ora33)(CID=(PROGRAM=sqlplus)(HOST=ecv33.localdomain)(USER=oracle))))
VERSION INFORMATION:
TNS for Linux: Version 10.2.0.1.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 10.2.0.1.0 - Production
Time: 05-JUN-2009 13:24:52
Tracing not turned on.
Tns error struct:
ns main err code: 12537
TNS-12537: TNS:connection closed
ns secondary err code: 12560
nt main err code: 507
TNS-00507: Connection closed
nt secondary err code: 0
nt OS err code: 0
原因分析:
(1)检查实例参数:
n PROCESSES:300
n SESSIONS:350
(2)检查v$resource_limit
当实际的进程数达到200个左右时,就连不到ORACLE了。报ORA-12537错。当发生这种错误时,一般是由于PROCESS参数设得不够大所导致,但这个CASE有点例外,当实际进程数达到200时就不行了,这是为什么呢?
这是因为,还有一个原因会导致这个错误的发生:那就是OS的内存使用状况。当OS的内存使用率达到90%以上时,既使是还可以再建立100个进程,但此时由于OS再也分配不出更多的内存来给ORACLE的服务进程了,所以监听器就没办法给进来和客户端连接启动一个专用的ORACLE SERVER PROCESS(我们知道,在DEDICATED SERVER模式,一个客户端连接的建立,ORACLE就会启动一个专用的SERVER PROCESS来服务这个客户端连接)。我们来检查一下OS的内存状况:
[oracle@ecv33 admin]$ free
total used free shared buffers cached
Mem: 8160800 8142776 18024 0 10236 6809660
-/+ buffers/cache: 1322880 6837920
Swap: 8388600 104252 8284348
果然,OS的内存使用率已达99%了。
解决方法:
增加ORACLE服务器的物理内存