在进行数据库开发的时候,通常需要连接Oralce数据库,在进行连接时,经常性的会提示TNS-03505: Failed to resolve name(无法解析服务名),从而导致无法连接到数据库实例,那么通过本文对造成该问题的常见原因进行分析及如何解决。
1.使用了不存在的服务名
Oracle客户端配置文件tnsnames.ora中配置的数据库服务名为CREDITDB配置项中的SERVICE_NAME变量,在dos窗口输入,tnsping orcl检查服务是否可用,但在进行连接时则会提示TNS-03505,具体原因为需要连接的orcl服务在客户端配置文件中并不存在
- CREDITDB =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = creditdb)
- )
- )
-
- LISTENER_CREDITDB =
- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
-
-
- ORACLR_CONNECTION_DATA =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
- )
- (CONNECT_DATA =
- (SID = CLRExtProc)
- (PRESENTATION = RO)
- )
- )
- Microsoft Windows [版本 10.0.19045.3324]
- (c) Microsoft Corporation。保留所有权利。
-
- C:\Users\xxxxxx>tnsping orcl
-
- TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 10-9月 -2023 21:09:57
-
- Copyright (c) 1997, 2010, Oracle. All rights reserved.
-
- 已使用的参数文件:
- F:\app\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
-
- TNS-03505: 无法解析名称
tnsping命令:用于测试和查看数据库服务配置是否有效
命令格式:tnsping IP地址:端口号/数据库服务名 [count]
tnsping 网络服务名 [count]
如果能够ping通,则说明客户端能解析listener的机器名,而且listener也已经启动,但是并不能说明数据库已经打开,而且tsnping的过程与真正客户端连接的过程也不一致。但是如果不能用tnsping通,则肯定连接不到数据库
2.默认域名追加
除第一种情况外,经检查PLSQL Developer 连接数据库与客户端配置文件中配置的服务名也一致,但还是无法连接数据库,同样提示TNS-03505的错误。
1). 出现该场景时需检查oracle数据库sqlnet.ora网络配置文件,是否配置了NAMES.DEFAULT_DOMAIN变量是否定义了默认的域名。
在连接数据库的时候,oracle会自动将默认的域名追加到网络服务名之后,网络服务名就会自动变为:域名:网络服务名
解决办法:删除或注释sqlnet.ora配置文件中的NAMES.DEFAULT_DOMAIN变量
2).如果不注释sqlnet.ora配置文件中的NAMES.DEFAULT_DOMAIN变量时,则需要将客户端配置文件tnsnames.ora中的服务追加sqlnet.ora中配置的域名,即配置方法如下:
- sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN变量值.CREDITDB =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = creditdb)
- )
- )
-
- LISTENER_CREDITDB =
- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
-
-
- ORACLR_CONNECTION_DATA =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
- )
- (CONNECT_DATA =
- (SID = CLRExtProc)
- (PRESENTATION = RO)
- )
- )