[记录]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有没有错


以上,是简单的记录。







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