今天又遇到幾天前遇到的一個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
。