登錄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.oraTNS-03505: 無法解析名稱 很顯然問題出在sqlnet.ora中
4、打開sqlnet.ora,會發現裏面只有兩句話是未被註釋的,如果打開的是sample裏的……都是被註釋的
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
將使用TNSNAMES進行解析,tnsnames在哪裏?在tnsnames.ora裏,看一下里面的SERVICE_NAME或者SID有沒有錯
以上,是簡單的記錄。