[記錄]ora-12541:tns:無監聽程序

登錄plsql報ora-12541:tns:無監聽程序的原因有很多,有時需要修改listener.ora,有時還需要修改tnsnames.ora,我還碰到過更麻煩的,最後直接重裝了,還好都有備份-  -

以前沒有寫博客的習慣,很多情況都沒有記錄,現在碰到問題又要重頭摸索,今天又碰到這個問題,記錄一下。

解決思路:

1、既然是報無監聽的錯,就先看一下監聽情況,使用lsnrctl status

LSNRCTL for 32-bit Windows: Version 11.1.0.7.0 - Production on 04-12月-2012 09:26:19

Copyright (c) 1991, 2008, Oracle.  All rights reserved.

正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=aaa)(PORT=1521)))
TNS-12541: TNS: 無監聽程序
TNS-12560: TNS: 協議適配器錯誤
TNS-00511: 無監聽程序
32-bit Windows Error: 61: Unknown error

無監聽程序


2、使用lsnrctl start啓動一下

LSNRCTL for 32-bit Windows: Version 11.1.0.7.0 - Production on 04-12月-2012 09:26:40

Copyright (c) 1991, 2008, Oracle.  All rights reserved.

啓動tnslsnr: 請稍候...

TNSLSNR for 32-bit Windows: Version 11.1.0.7.0 - Production
系統參數文件爲F:\app\Administrator\OraHome_1\network\admin\listener.ora
寫入f:\app\administrator\diag\tnslsnr\aaa\listener\alert\log.xml的日誌信息
監聽該對象時出錯: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=aaa)(PORT=1521)))
TNS-12542: TNS: 地址已被佔用
TNS-12560: TNS: 協議適配器錯誤
TNS-00512: 地址已在使用
32-bit Windows Error: 48: Unknown error

報錯地址已被佔用,好現象,地址被佔用只是小事情啊

3、使用netstat -aon|findstr "1521"看下哪個佔了端口

TCP    127.0.0.1:1110         127.0.0.1:1521         ESTABLISHED     928
TCP    127.0.0.1:1521         127.0.0.1:1110         ESTABLISHED     1920
本地端口1521被pid爲1920的進程佔用了,好奇的話可以使用tasklist|findstr "1920"看一下是哪個進程,不好奇的話可以直接殺掉


4、使用taskkill /pid 1920 /t殺掉進程,/t的作用是殺掉進程和所有由此啓動的子進程


5、再使用lsnrctl start 啓動一下

LSNRCTL for 32-bit Windows: Version 11.1.0.7.0 - Production on 04-12月-2012 09:35:50

Copyright (c) 1991, 2008, Oracle.  All rights reserved.

啓動tnslsnr: 請稍候...

TNSLSNR for 32-bit Windows: Version 11.1.0.7.0 - Production
系統參數文件爲F:\app\Administrator\OraHome_1\network\admin\listener.ora
寫入f:\app\administrator\diag\tnslsnr\aaa\listener\alert\log.xml的日誌信息
監聽: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=aaa)(PORT=1521)))

正在連接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=aaa)(PORT=1521)))
LISTENER 的 STATUS
------------------------
別名                      LISTENER
版本                      TNSLSNR for 32-bit Windows: Version 11.1.0.7.0 - Production
啓動日期                  04-12月-2012 09:35:51
正常運行時間              0 天 0 小時 0 分 3 秒
跟蹤級別                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
監聽程序參數文件          F:\app\Administrator\OraHome_1\network\admin\listener.ora
監聽程序日誌文件          f:\app\administrator\diag\tnslsnr\aaa\listener\alert\log.xml
監聽端點概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=aaa)(PORT=1521)))
服務摘要..
服務 "ORCL" 包含 1 個例程。
  例程 "ORCL", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...
服務 "PLSExtProc" 包含 1 個例程。
  例程 "PLSExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理程序...
命令執行成功
啓動成功,再登陸就不報錯了。


=====================================================分割線在此===========================================================

以上是我碰到的最簡單的12541錯誤原因,還有第二簡單的是ip地址改動

1、如果使用lsnrctl start報錯


TNS-12545: 因目標主機或對象不存在, 連接失敗
TNS-12560: TNS: 協議適配器錯誤
TNS-00515: 因目標主機或對象不存在, 連接失敗
32-bit Windows Error: 49: Unknown error

監聽程序未能啓動。請參閱上面的錯誤消息...
就有可能是因爲ip地址不對鳥,需要查看listener.ora的內容:

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=aaa)(PORT=1521)))
HOST是地址,port是端口

改一下,如果是本地,一般使用計算機名或者127.0.0.1

2、這樣子修改後lsnrctl start啓動監聽就成功了,但是使用plsql登錄還是可能失敗,此時就需要在tnsnames.ora中添加服務

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
也可以使用net manager添加

3、到這一步,還是會啓動失敗

這次的錯誤如果變成TNS-12514: TNS: 監聽程序當前無法識別連接描述符中請求的服務,就還好辦

無法識別連接描述符中請求的服務是解析的問題,可以使用tnsping orcl看一下

正常情況下的結果是這樣的

Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator>tnsping orcl

TNS Ping Utility for 32-bit Windows: Version 11.1.0.7.0 - Production on 04-12月-2012 10:11:46

Copyright (c) 1997, 2008, Oracle.  All rights reserved.

已使用的參數文件:
F:\app\Administrator\OraHome_1\network\admin\sqlnet.ora


已使用 TNSNAMES 適配器來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(P
ORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl) (UR=A)))
OK (30 毫秒)

C:\Documents and Settings\Administrator>
如果出錯了,

已使用的參數文件:
F:\app\Administrator\OraHome_1\network\admin\sqlnet.ora
TNS-03505: 無法解析名稱

很顯然問題出在sqlnet.ora中


4、打開sqlnet.ora,會發現裏面只有兩句話是未被註釋的,如果打開的是sample裏的……都是被註釋的

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

將使用TNSNAMES進行解析,tnsnames在哪裏?在tnsnames.ora裏,看一下里面的SERVICE_NAME或者SID有沒有錯


以上,是簡單的記錄。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章