Oracle ORA-12154: TNS:could not resolve service name错误的解决方法

本文解决了一个同事在使用Oracle 9i时遇到的ORA-12154错误,即TNS无法解析服务名的问题。通过检查tnsnames.ora和服务配置,最终发现sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN参数设置不当导致了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天一同事反映在使用Oracle9i时,在Net Assistant里配置服务名测试通过,但在使用SQL*PLUS等客户端工具时老是连接不上。

·首先检查服务名是否存在,发现服务名的确存在而且在Net Assistant中确实可以连接并测试通过。

·接下来用SQL*PLUS连接报错,错误显示:ORA-12154: TNS:could not resolve service name

·使用Oracle的tnsping命令测试报错,错误显示:TNS-03505: 未能分解名称

本人百思不得其解,只能上网google,多番查找之后终于找到了一篇文章,发现里面的情况和我的一摸一样。现摘录如下:

(尊重原创:作者博客地址为:http://blog.chinaunix.net/u1/44757/index.html)

以下内容为转载部分:
----------------------------------------------------------------------------------------------------------------------------------------
ORA-12154: TNS:could not resolve service name

错误指出客户不能查找到tnsnames.ora文件中所列举的服务。

查错误码显示:

ORA-12154: TNS:could not resolve service name
Cause: Oracle Net could not locate the net service name specified in the tnsnames.ora configuration file.

Action: Perform these steps:
1.Verify that a tnsnames.ora file exists.(See Also: "Localized Configuration File Support" for configuration file location information)

2.Verify that there are not multiple copies of the tnsnames.ora file.

3.In the tnsnames.ora file, verify that the net service name specified in your connect string is mapped to a connect descriptor.

4.Verify that there are no duplicate copies of the sqlnet.ora file.

5.If you are using domain names, verify that your sqlnet.ora file contains a NAMES.DEFAULT_DOMAIN parameter. If this parameter does not exist, you must specify the domain name in your connect string.

6.If you are not using domain names, and this parameter exists, delete it or disable it by commenting it out.

7.If you are connecting from a login dialog box, verify that you are not placing an "@" symbol before your connect net service name.

8.Activate client tracing and repeat the operation.


Cause: Oracle Net could not locate the database service name or net service name specified in the directory server.

Action: Perform these steps:
1.Verify that the database service or net service name entry exists in the directory that this computer was configured to use.
  (See Also: Chapter 8, "Setting Up Directory Server Usage" for directory setup instructions)

2.Verify that the sqlnet.ora file includes the following entry: NAMES.DIRECTORY_PATH=(ldap, other_naming_methods)
  根据文档中的提示第三步3.(1.2没问题了)检查tnsnames.ora文件中的服务名称是否正确的配置,经过检查(SERVICE_NAME = hatest)没有问题
  然后按照文档做第4.5步,到第6步时发现问题,sqlnet.ora文件中引用了domain域(注:我们这边没使用域)
  [oracle@localhost admin]$ cat sqlnet.ora
  # SQLNET.ORA Network Configuration File: /home/oracle/OraHome1/network/admin/sqlnet.ora
  # Generated by Oracle configuration tools.
  NAMES.DEFAULT_DOMAIN = localdomain
  NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)--这个没问题啦

  好了那还等什么编辑该文件把domain干掉。编辑完后赶快tnsping hatest
  [oracle@localhost admin]$ tnsping hatest
  TNS Ping Utility for Linux: Version 9.2.0.4.0 - Production on 26-APR-2007 16:33:39
  Copyright (c) 1997 Oracle Corporation.  All rights reserved.
  Used parameter files:
  /home/oracle/OraHome1/network/admin/sqlnet.ora
  Used TNSNAMES adapter to resolve the alias
  Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =  
  192.168.248.155)(PORT = 1521))) (CONNECT_DATA = (SID = hatest) (SERVER = DEDICATED)))
  OK (30 msec)

  没问题通了。再连接数据库

  [oracle@localhost admin]$ sqlplus hangan/hangan@hatest
  SQL*Plus: Release 9.2.0.4.0 - Production on Thu Apr 26 16:33:49 2007
  Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
  Connected to:
  Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
  With the Partitioning, OLAP and Oracle Data Mining options
  JServer Release 9.2.0.4.0 - Production
 
  SQL> exit
----------------------------------------------------------------------------------------------------------------------------------------

看了上面的描述之后,我按照步骤一步步检查,到了检查sqlnet.ora文件的时候,问题就出来了。原来这位同事的sqlnet.ora文件中是这样的:

# SQLNET.ORA Network Configuration File: C:/oracle/ora81/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DEFAULT_DOMAIN = eapac.ericsson.se

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (ONAMES)

可以看到这里只使用了ONAMES来查找服务,但他的服务是配置在tnsnames.ora文件中,当在SQL*PLUS中连接时,Oracle不是按tnsname的方式来查找,当然找不到服务了。

问题找到了,将NAMES.DIRECTORY_PATH 改为:
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)

再测试连接通过,问题解决。

在此要感谢博文的博主,也感觉文中的DBA解决问题的思路很清晰,看来自己离一个合格的DBA还有很长的距离,继续努力中。
<think>好的,用户遇到了在Windows系统中连接Oracle数据库时出现的ORA-12154错误,需要解决方案。首先,我需要回忆一下这个错误的常见原因和解决方法。根据提供的引用内容,ORA-12154通常是由于TNS配置问题导致的,比如tnsnames.ora文件中的配置错误,或者监听服务没有正确配置。 首先,用户的问题可能出在tnsnames.ora文件的配置上。引用[2]提到,这个错误是因为没有正确配置监听,需要检查tnsnames.ora中的条目是否正确,包括监听名称、主机IP、端口和服务名。另外,引用[3]和[4]也提到监听程序和服务是否启动,所以需要确认Oracle的监听服务(如OracleOraDb11g_home1TNSListener)和对应的数据库服务(如OracleServiceORCL)是否正在运行。 接下来,要整理解决步骤。第一步应该是检查tnsnames.ora文件的位置是否正确,通常在ORACLE_HOME的network/admin目录下。然后核对文件中的配置是否符合格式,比如是否有拼写错误,主机IP是否正确,服务名是否与远程数据库一致。同时,要确保监听程序配置正确,可以使用Net Manager工具来检查,如引用[3]所述。 另外,用户可能配置了多个Oracle客户端,导致使用了错误tnsnames.ora文件,需要检查环境变量TNS_ADMIN是否指向正确的目录。如果配置正确,但问题依旧,可能需要重启监听服务和数据库实例,如引用[4]提到的服务启动问题。 还要注意连接字符串的格式是否正确,使用Easy Connect方式测试是否能连接,比如sqlplus username/password@host:port/service_name,这有助于判断是否是TNS配置的问题。如果Easy Connect能连接,说明问题确实出在TNS配置上。 最后,要确保所有步骤中的细节都被覆盖,比如路径是否正确,服务是否启动,配置是否有语法错误等。同时,根据引用中的案例,可能需要处理其他相关错误,如ORA-12514,但用户当前的问题主要是12154,所以先集中在TNS配置和服务检查上。</think>### 分步解决方案:Windows系统Oracle ORA-12154错误排查与修复 #### 1. 检查TNS配置文件的完整性和路径 - **验证文件位置** TNS配置文件$tnsnames.ora$默认路径为$ORACLE_HOME\NETWORK\ADMIN$(例如:`C:\app\oracle\product\19.0.0\dbhome_1\NETWORK\ADMIN`)。若使用多版本客户端,需确认环境变量$TNS_ADMIN$是否指向正确的目录[^2][^3]。 - **检查配置语法** 打开$tnsnames.ora$文件,确认连接描述符格式正确,例如: ```plaintext ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL) ) ) ``` 需重点检查$HOST$(IP地址)、$PORT$(默认1521)、$SERVICE_NAME$是否与远程数据库一致[^4]。 --- #### 2. 验证Oracle服务状态 - **启动监听服务** 按`Win+R`输入`services.msc`,查找以下服务: - `OracleOraDb19c_home1TNSListener`(监听服务) - `OracleServiceORCL`(数据库实例服务,名称根据实际调整) 确保这两个服务状态为**已启动**,若未启动需手动启动[^3]。 --- #### 3. 使用Net Manager工具配置 1. 打开`Oracle Net Manager`(开始菜单 > Oracle目录 > 配置和移植工具) 2. 在**服务命名**中添加或修改连接描述符: - 输入网络服务名(如`ORCL_TEST`) - 选择协议为`TCP/IP`,填写正确的主机IP和端口 - 服务名需与数据库实例的$SERVICE_NAME$一致(可通过远程服务器执行`SHOW PARAMETER service_names`查询) --- #### 4. 测试连接并排查其他可能性 - **使用TNSPING工具验证** 命令行执行: ```bash tnsping ORCL ``` 若返回`OK`表示TNS解析正常,否则需重新检查配置。 - **尝试Easy Connect语法** 直接通过SQLPlus连接: ```bash sqlplus username/[email protected]:1521/ORCL ``` 若此方式成功但TNS连接失败,则确认是TNS配置问题。 --- #### 5. 处理特殊情况 - **客户端版本冲突** 若安装过多个Oracle客户端(如PL/SQL Developer自带客户端),需: 1. 检查`PATH`环境变量中Oracle客户端的优先级 2. 在连接工具中显式指定$TNS_ADMIN$路径 - **防火墙拦截** 确保1521端口在服务器和客户端防火墙中已放行。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值