今天又遇到几天前遇到的一个Oracle连接问题,崩溃,因为前边我已经遇到了这个问题,当时没有解决,也花了不少时间,搞来搞去最后还是不行,今天查找问题根源时:
又去看了一下各个日志,最后看了一下alert/log.xml发现日志文件里重复很多遍的一个错误,内容如下:
<msg time='2010-09-03T01:37:13.578+08:00' org_id='oracle' comp_id='clients'
type='UNKNOWN' level='16' host_id='PC-20100723HCXR'
host_addr='192.168.1.153'>
<txt> nt OS err code: 0
</txt>
</msg>
到网上去搜解决办法,最后找到了一个解决办法,英文的这里先将大致步骤翻译一下,如果觉得翻译的不好,大家就直接去点本文最后的英文连接查看,推荐查看原文。毕竟俺不是很专业的英文翻译人士。
好了快来看一下吧。
同步记录在sqlnet.log 如下错误:
Fatal NI connect error 12518, connecting to:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.153)(PORT=1521))(CONNECT_DATA=(SID=orcl)(CID=(PROGRAM=D:\app\product\11.2.0\dbhome_1\bin\emagent.exe)(HOST=PC-20100723HCXR)(USER=SYSTEM))))
VERSION INFORMATION:
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
Windows NT TCP/IP NT Protocol Adapter for 32-bit Windows: Version 11.2.0.1.0 - Production
Time: 03-9月 -2010 00:45:29
Tracing not turned on.
Tns error struct:
ns main err code: 12564
TNS-12564: TNS: 拒绝连接
ns secondary err code: 0
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
英文引文中的错误如下:
VERSION INFORMATION:
TNS for Linux: Version 10.2.0.2.0 - Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 10.2.0.2.0 - Production
TCP / IP NT Protocol Adapter for Linux: Version 10.2.0.2.0 - Production
Time: 19-JUL-2006 11:25:26
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: TNS: operation timed out
ns secondary err code: 12606
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
Client address: (ADDRESS = (PROTOCOL = tcp) (HOST = 192.168.1.123) (PORT = 58147))
这个错误和一个network连接和错误有关系,Metalink 给出了如下的解决方案:
1. 在listener.ora里设置如下内容 : INBOUND_CONNECT_TIMEOUT_ <listenername> = 0
2. 在sqlnet.ora里或者服务器端 设置如下内容: SQLNET.INBOUND_CONNECT_TIMEOUT = 0
3. 关闭并重新启动listener 和 database(listener服务和数据库(初学的朋友如果不太会命令可以在cmd里输入:services.msc打开windows服务,并重新启动所有以oracle开头的服务就ok了)。
4. 现在设置好上边的内容之后,重新尝试连接DB并且遵守行为(遵守行为是在不知道怎么翻译,大家忍耐一下原文是:
Now try to connect to DB and observe the behaviour)
这样做之后在服务器端和Listener是比较迟钝的。因此我们或许需要reload一下它。
具体操作如下:
[Oracle @ order admin] $ lsnrctl
LSNRCTL for Linux: Version 10.2.0.2.0 - Production on 19-JUL-2006 15:26:33
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Welcome to LSNRCTL, type "help" for information.
LSNRCTL> reload
Connecting to (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = 172.16.9.11) (PORT = 1521)))
The command completed successfully
LSNRCTL> services
Connecting to (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = 172.16.9.11) (PORT = 1521)))
Services Summary ...
Service "order" has 2 instance (s).
Instance "order", status UNKNOWN, has 1 handler (s) for this service ...
Handler (s):
"DEDICATED" established: 0 refused: 0
LOCAL SERVER
Instance "order", status READY, has 1 handler (s) for this service ...
Handler (s):
"DEDICATED" established: 0 refused: 0 state: ready
LOCAL SERVER
The command completed successfully
LSNRCTL> show inbound_connect_timeout
Connecting to (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = 172.16.9.11) (PORT = 1521)))
LISTENER parameter "inbound_connect_timeout" set to 0
The command completed successfully
LSNRCTL> exit
在windows下通俗点说就是:
1. 在cmd中输入: lsnrctl
2. 打开Listener控制台,然后输入reload命令,重载
3. 输入:services命令
4. 输入show inbound_connect_timeout查看设置是否成功
5. 最后输入:exit命令推出控制台
这样以后尝试连接一下数据库,或许就可以了,我尝试的结果是,第一次行ok,然后好像又不行了,就又设置了一下应该问题不大,总而言之,这个问题算是解决了,现在数据库正常连接了。
本文主要参考连接:
http://www.kods.net/oracle10gr2-ora-3136-error-solution/
对于这个问题在JavaEye上有一位叫做"jinchunjian"的Java Friend 也给了一个解决方案,讲的很不错,大家可以分享一下:
http://yinchunjian.iteye.com/blog/697153
附带一点内容:
执行一下内容可以重启监听器和EM:
lsnrctl stop
lsnrctl start
emctl stop dbconsole
emctl start dbconsole
。