Problem Description
---------------------------------------------------
查看alert警告日志,经常发现很多如下报错
Mon Nov 09 18:40:11 2015
***********************************************************************
Fatal NI connect error 12170.
VERSION INFORMATION:
TNS for Linux: Version 11.2.0.4.0 - Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production
Time: 09-NOV-2015 18:40:11
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: TNS:operation timed out
ns secondary err code: 12560
nt main err code: 505
TNS-00505: Operation timed out
nt secondary err code: 110
nt OS err code: 0
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=10.0.105.11)(PORT=60866))
问题解决:
如下文档解释了这个错误
Fatal NI Connect Error 12170, 'TNS-12535: TNS:operation timed out' Reported in 11g Alert Log ( Doc ID 1286376.1 )
Alert Log Errors: 12170 TNS-12535/TNS-00505: Operation Timed Out ( Doc ID 1628949.1 )
基本上这是一个告知性的消息。它的意思是说
The messages indicate the specified client connection (identified by the 'Client address:' details) has experienced a time out.
通常是由于客户端发起的连接没有经过正常的流程结束引起的。一个常见的场景是,从客户端连接数据库,比如通过plsql工具,连上之后,很久没有操作,
然后网络防火墙发现了这个空闲的连接超过了设置的允许时间,于是中断了它。数据库端就会记这个错误。比较糟糕的一种情况是,发起一个非常长时间的查询,
数据库由于要运行很久才会给客户端发送回复,结果超过了防火墙允许的时间,于是被中断了。
所以关键在于您的应用方面是否有异常,如果应用方面正常,那么也可以不必管它。
一个常用的解决方式是在$ORACLE_HOME/network/admin下的sqlnet.ora文件中设置
SQLNET.EXPIRE_TIME=n Where <n> is a non-zero value set in minutes.
比如
SQLNET.EXPIRE_TIME=3
设置这个参数后,Oracle服务器会每隔n分钟向所有的客户端连接发送一个非常小的侦测包,大约10byte,这个侦测包本身构成了连接上的活跃通讯,从而避免防火墙认为这个连接是空闲的。
如果设置了这个参数,仍然有错误,而且非常频繁的话,那么可以考虑检查一下报错的客户端地址,看该客户端上有什么应用会导致这个异常?