登录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>
如果出错了,
TNS-03505: 无法解析名称 很显然问题出在sqlnet.ora中已使用的参数文件: F:\app\Administrator\OraHome_1\network\admin\sqlnet.ora
4、打开sqlnet.ora,会发现里面只有两句话是未被注释的,如果打开的是sample里的……都是被注释的
SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
将使用TNSNAMES进行解析,tnsnames在哪里?在tnsnames.ora里,看一下里面的SERVICE_NAME或者SID有没有错
以上,是简单的记录。