【Oracle数据库】ORA-12541: TNS:no listener 的详细解决方案


 

错误提示:

ERROR:
ORA-12541: TNS:no listener

错误原因:

1、本次错误是由于使用清理注册表造成的,故慎用Windows优化大师。

2、配置过ORACLE,请不要修改机器名称。

解决方案:

一、连接主机字符串,报告没有监听器
C:\Documents and Settings\u120594> connect username/password@orcl;
ORA-12541: TNS:no listener
C:\Documents and Settings\u120594>



二、运行监听器

C:\Documents and Settings\u120594>lsnrctl

LSNRCTL for 32-bit Windows: Version 9.2.0.1.0 - Production on 07-7月 -2009 10:08
:08

Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.

欢迎来到LSNRCTL,请键入"help"以获得信息。

三、通过查看监听器状态给出解决办法

情况一,只报告无监听器

LSNRCTL> status
正在连接到 (ADDRESS=(PROTOCOL=tcp)(PORT=1521))
TNS-12541: TNS:无监听器
TNS-12560: TNS: 协议适配器错误
TNS-00511: 无监听器
   32-bit Windows Error: 61: Unknown error


LSNRCTL> start
启动tnslsnr:请稍候...

Failed to open service <OracleOraHome92TNSListener>, error 1060.
TNSLSNR for 32-bit Windows: Version 9.2.0.1.0 - Production
写入D:\oracle\ora92\network\log\listener.log的日志信息
监听:(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sha120594n02.clients.apac.cpwr.c
orp)(PORT=1521)))

正在连接到 (ADDRESS=(PROTOCOL=tcp)(PORT=1521))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 32-bit Windows: Version 9.2.0.1.0 - Produc
tion
启动日期                  07-7月 -2009 10:08:49
正常运行时间              0 天 0 小时 0 分 4 秒
跟踪级别                  off
安全性                    OFF
SNMP                      OFF
监听器日志文件          D:\oracle\ora92\network\log\listener.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sha120594n02.clients.apac.cpwr.corp)
(PORT=1521)))
监听器不支持服务
命令执行成功

情况二,除了报告无监听器还报告地址的协议专用组件指定不正确

LSNRCTL> status
连接至(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(PORT=1521)))
TNS-01103: 地址的协议专用组件指定不正确
TNS-12541: TNS:无监听器

TNS-12560: TNS:协议适配器出现错误
TNS-00511: 无监听器
32-bit Windows Error: 61: Unknown error


LSNRCTL> start
启动tnslsnr:请稍候...
Failed to start service, error 3.
TNS-12536: TNS:可能会阻碍*作
TNS-12560: TNS:协议适配器出现错误
TNS-00506: *作可能阻塞
32-bit Windows Error: 997: Unknown error
LSNRCTL>

这种情况的解决方案如下:
1、在控制面板中启动服务,出现以下错误
服务:在本地计算机 无法启动 OracleOraHome92TNSListener服务。
错误3:系统找不到指定的路径
而且OracleOraHome92TNSListener服务的可执行文件的路径是空的。

2、进入注册表中修改ImagePath
在运行处执行REGEDIT进入注册表到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleOraHome92TNSListener
发现ImagePath关键值没有了,增加他,选择可扩充字符串值,编辑字符串的数值数据为:D:\oracle\ora92\BIN\TNSLSNR 退出注册表。

3、再次启动监听器
LSNRCTL> start
TNS-01106: 使用名称LISTENER的监听器已经启动

四、这时查看监听器的状态,监听器已经恢复正常
LSNRCTL> status
正在连接到 (ADDRESS=(PROTOCOL=tcp)(PORT=1521))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 32-bit Windows: Version 9.2.0.1.0 - Produc
tion
启动日期                  07-7月 -2009 10:08:49
正常运行时间              0 天 0 小时 2 分 18 秒
跟踪级别                  off
安全性                    OFF
SNMP                      OFF
监听器日志文件          D:\oracle\ora92\network\log\listener.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sha120594n02.clients.apac.cpwr.corp)
(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sha120594n02.clients.apac.cpwr.corp)
(PORT=8080))(Presentation=HTTP)(Session=RAW))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=sha120594n02.clients.apac.cpwr.corp)
(PORT=2100))(Presentation=FTP)(Session=RAW))
服务摘要..
服务 "Covisint" 包含 1 个例程。
例程 "Covisint", 状态 READY, 包含此服务的 1 个处理程序...
服务 "CovisintXDB" 包含 1 个例程。
例程 "Covisint", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功


五、再去连接,成功
C:\Documents and Settings\u120594> connect username/password@orcl;
连接成功。
C:\Documents and Settings\u120594>

<think>好的,用户现在遇到了Docker中启动Oracle后,用Navicat连接时出现ORA-12541:TNS无监听程序的问题。我需要根据之前提供的引用内容来帮助他解决这个问题。首先,我应该回忆一下用户提供的引用内容,看看里面提到的解决方法有哪些。引用1提到在Docker中配置Oracle11g时,按照步骤解决了连接超时的问题,但后来出现了ORA-12541,建议参考3.1的内容。这可能涉及到监听程序的配置是否正确。引用2中,用户更改了listener.ora文件中的HOST值,将localhost改为本机IP,解决了Navicat连接的问题。引用3同样修改了listener.ora,将HOST设置为计算机名,但用户可能用的是IP更有效。接下来,我需要整理出解决这个问题的步骤。首先,检查监听器状态,确保监听服务已经启动。然后,查看listener.ora的配置是否正确,特别是HOST是否设置为Docker容器的IP或者宿主机的IP,或者0.0.0.0。另外,可能需要检查Oracle容器的端口映射是否正确,1521端口是否暴露出来,并且宿主机的防火墙是否允许该端口。用户是在Docker环境中运行Oracle,所以需要确认容器内的监听地址是否能够被外部访问。如果HOST设置为localhost或者127.0.0.1,那么外部连接是无法到达的,必须改为宿主机的IP或者容器的IP。另外,可能还需要重启监听服务,或者重新生成容器配置。此外,用户使用Navicat连接,需要确保TNS配置中的主机地址正确,可能指向宿主机的IP和映射的端口。同时,检查Docker运行时的端口映射参数是否正确,比如-p1521:1521是否设置正确。总结步骤应该是:1.检查监听器配置,修改HOST为正确IP;2.确认端口映射;3.重启监听服务;4.检查防火墙设置;5.测试连接。可能还需要进入容器内部操作,比如使用lsnrctlstatus查看监听状态,修改配置后重新加载监听器等。需要提醒用户注意,不同的Oracle版本可能配置文件路径不同,比如11g和19c的路径差异。同时,如果容器重启后配置丢失,可能需要修改Dockerfile或使用持久化存储来保存配置更改。最后,生成相关问题,帮助用户深入理解可能遇到的问题,比如如何修改Oracle配置文件,如何诊断监听问题,以及Docker网络配置的影响等。</think>### Docker中Oracle启动后Navicat连接ORA-12541错误解决方案 #### 1. 检查监听器配置文件 进入Oracle容器,修改`listener.ora`文件的`HOST`值为宿主机的实际IP(非`localhost`或容器内部IP): ```bash # 容器内路径示例(Oracle 11g/19c): /opt/oracle/product/[版本号]/dbhome_1/network/admin/listener.ora # 修改内容示例: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ``` *若使用Docker部署,`HOST`应设为宿主机IP或`0.0.0.0`以实现跨网络访问[^2][^3]。* #### 2. 验证Docker端口映射 启动容器时需确保开放1521端口: ```bash docker run -d -p 1521:1521 --name oracle11g oracle11g ``` 使用`tcping`或`telnet`测试端口可达性: ```bash tcping 192.168.1.100 1521 ``` #### 3. 重启监听服务 在容器内执行: ```bash lsnrctl stop lsnrctl start lsnrctl status # 检查"Listening on"地址是否包含正确IP ``` #### 4. 防火墙配置 临时关闭防火墙或添加放行规则(以CentOS为例): ```bash firewall-cmd --permanent --add-port=1521/tcp firewall-cmd --reload ``` #### 5. Navicat连接配置 - 主机地址:宿主机IP - 端口:1521 - 服务名:`ORCLCDB`(Oracle 19c)或`XE`(Express Edition) #### 典型错误场景对照表 | 错误现象 | 解决方案 | |-------------------|----------------------------| | ORA-12541 | 监听未启动/HOST配置错误 | | ORA-12170 | 防火墙/端口映射问题 | | ORA-01017 | 用户名密码错误 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值