[记录]ora-12541:tns:无监听程序

来源:互联网 发布:阿里云做网站教程 编辑:程序博客网 时间:2024/05/21 21:41

登录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:19Copyright (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:40Copyright (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     928TCP    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:50Copyright (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 AuthenticationSNMP                      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 orclTNS Ping Utility for 32-bit Windows: Version 11.1.0.7.0 - Production on 04-12月-2012 10:11:46Copyright (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)(PORT = 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有没有错


以上,是简单的记录。