ORA-12541:TNS无监听程序求助——虚拟机连接物理机Oracle数据库
问题:虚拟机连接物理机Oracle数据库报ORA-12541错误
环境信息:
- 虚拟机:Oracle VM VirtualBox运行Windows XP,已安装Visual Studio .NET 2003、NHibernate ORM
- 物理机:Windows 11系统,部署Oracle 12.2数据库
- 网络状态:虚拟机与物理机ping测试正常,网络连通性没问题
操作与错误:
在虚拟机中执行SQL*Plus命令sqlplus user/pass@service连接物理机数据库时,触发错误:ORA-12541: TNS: 无监听程序
排查方向:怀疑
listener.ora或tnsnames.ora配置有误,多次修改参数仍未解决
虚拟机中的tnsnames.ora配置(原内容含语法错误)
LISTENER = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.56.7) (PORT = 1521) ) orcl = (DESCRIPTION = ADDRESS = our text`(PROTOCOL = TCP) (HOST = 192.168.56.7) (PORT = 1521) ) (CONNECT_DATA = (SERVER = dedicated) (SERVICE_NAME = orcl) ) )
物理机中的listener.ora配置
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = orcl) (ORACLE_HOME = C:\app\orclDiego\product\12.2.0\dbhome_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:C:\app\orclDiego\product\12.2.0\dbhome_1\bin\oraclr12.dll") ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.7)(PORT = 1521)) ) )
解决步骤
1. 修复虚拟机tnsnames.ora语法错误
原配置存在括号不匹配、冗余垃圾内容问题,修正后的正确配置如下:
orcl = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.7)(PORT = 1521)) (CONNECT_DATA = (SERVER = dedicated) (SERVICE_NAME = orcl) ) )
- 注意
ADDRESS部分需保持括号正确嵌套,删除原配置中的our text无效内容
2. 检查物理机监听状态
在物理机命令提示符执行:
lsnrctl status
- 若监听未启动,执行
lsnrctl start启动监听 - 确认输出中包含
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.7)(PORT=1521)),确保监听绑定了正确的IP
3. 验证物理机防火墙设置
- 检查Windows 11防火墙是否允许1521端口的TCP入站连接
- 可临时关闭防火墙测试连接,若能成功则需添加防火墙规则放行1521端口流量
4. 用EZConnect方式直接测试连接
绕过tnsnames.ora,在虚拟机执行简化命令验证网络与监听:
sqlplus user/pass@192.168.56.7:1521/orcl
- 若此命令成功,说明
tnsnames.ora仍有配置问题;若仍报错,需排查监听或网络底层问题
5. 确认数据库服务名正确性
在物理机SQL*Plus中执行查询,获取真实服务名:
SELECT sys_context('userenv', 'service_name') FROM dual;
确保tnsnames.ora中SERVICE_NAME字段与查询结果完全一致,避免拼写错误
内容的提问来源于stack exchange,提问作者ddelafuente
相关产品推荐
相关产品推荐

