tnsping能通 但SQL plus / @XX报错ORA-12514

51 篇文章 2 订阅
17 篇文章 0 订阅
使用 Oracle客户端的NetConfiguration Assistant,在本地配置了一个tns连接一个远程的 数据库,名称为romotedb。
 
然后通过 tnsping该remotedb,连接成功。
 
想当然的使用sqlplus来连接remotedb,结果报错:
 
ERROR:
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
很是奇怪!
 ======================

客户端的sqlnet.ora配置错误

NAMES.DIRECTORY_PATH常用的值有tnsnames,hostname,onames和ezconnect和ldap,cds,nis不常用的值,默认值是(tnsnames,onames,hostname)。 
   如果设置NAMES.DIRECTORY_PATH=(tnsnames),那么客户端就只会从tnsnames.ora查找你要连接的字符串(如orcl)记录,如果tnsname.ora文件中没有此记录,则连接不上数据库。 
   如果设置NAMES.DIRECTORY_PATH=(tnsnames,hostname),那么客户端首先会从tnsnames.ora查找你要连接的字符串(如orcl)记录,如果tnsname.ora文件中没有此记录,则尝试把你要连接的字符串(如orcl)当作一个主机名,通过网络的途径去解析它的ip地址然后去连接这个ip上GLOBAL_DBNAME=连接字符串(如orcl)这个实例,当然这里连接字符串(如orcl)并不是一个主机名,最后会尝试以ezconnect的方式连接数据库。
  
例如sqlnet.ora配置如下:
    NAMES.DIRECTORY_PATH=(TNSNAMES,ezconnect)
则可以同时支持如下格式的访问:
 $ sqlplus scott/tiger@orcl
 $ sqlplus scott/tiger@//service_IP(orhostname):1521/orcl
当然采用第一种格式时需要正确配置 tnsnames.ora,因为sqlplus需要在这里匹配IP地址、端口、服务名等参数

======================
参考网上很多类似错误的解决方案,登录到远程数据库,通过 lsnrctl status 命令查看当前监听情况,发现这里提供的service里面,并没有我前面配置 remotedb 时指定的 SERVICE_NAME ,马上改掉本地remotedb的 SERVICE_NAME 为远程提供的 service,tnsping 和 sqlplus都可以正常连接。

上面的问题,是因为数据库系统能根据提供的实例名(原来的SERVICE_NAME)去找到了相应的主机,故 tnsping能通,但是根据 tns指定的SERVICE_NAME 没有找到相应的服务名,所有在建立连接的时候报错了。

在这里,提一下比较容易弄混淆的概念,服务名、实例名和数据库名:
(1)服务名(service_names):指listener提供的对外的服务名,客户端可以通过配置tnsnmaes.ora进行连接,tnsnmaes.ora文件中的service_name要等于服务器端listener所注册的服务名,服务名可以通过输入lsnrctl后,在输入service查看,一般的service_name在listener.ora文件中配置(静态注册),或者当没有listener.ora文件时,在初始化文件中配置instance_name和service_names这2个参数进行动态注册。但是无论采用那种注册方式,都可以通过lsnrctl-sevice来检查。

(2)实例名(instance_name):oracle启动instance后,即启动oracle的内存进程,这个内存进程的名称。在unix或者linux环境可以通过ps -ef |grepora_看到启动的进程。instance_name由环境变量决定,一个只装oracle软件,没有建库的实例(即没有初始化文件,没有控制文件,没有数据文件,没有redolog),可以用rman来启动,启动后selectinstance_name fromv$instance;这个时候我们可以看到instance_name和在环境变量里面配置的ORACLE_SID是同样的名称。(注:正是由于这个原因,我们一般说的SID就是instance_name,但是需要注意的是,实际上instance_name不等于ORACLE_SID。前者是数据库层面的概念,后者是操作系统中环境变量的设置。)

(3)数据库名(db_name):这个是在数据库创建的时候确定的:
CREATE DATABASE db_name
CONTROLFILE REUSE
MAXINSTANCES 32
MAXLOGHISTORY 0
……

该信息存在于初始化文件,控制文件等地方。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ORA-12514错误是指连接Oracle数据库时出现的问题,提示TNS监听程序当前不知道所请求的连接描述符中的服务。这个错误常是因为连接描述符中指定的服务名称无效或不存在。 在Windows 10上解决这个问题的方法有以下几步: 1. 确保Oracle数据库已经正确安装并正在运行。可以过在命令提示符下输入`lsnrctl status`来检监听程序的状态。如果监听程序没有运行,可以使用`lsnrctl start`命令启动它。 2. 检连接描述符中指定的服务名称是否正确。可以使用Oracle客户端工具(如SQL*Plus或SQL Developer)或Navicat等第三方工具来连接数据库,确保连接描述符中的服务名称与数据库中的服务名称一致。 3. 检网络连接是否正常。确保客户端机器可以正常访问数据库服务器,并且网络配置正确。尝试ping数据库服务器的IP地址来测试网络连接。 4. 检防火墙设置。确保防火墙没有阻止客户端与数据库服务器之间的信。如果有必要,可以在防火墙中添加允许连接数据库的规则。 5. 如果以上方法都没有解决问题,可以尝试重新配置监听程序。可以编辑监听程序的配置文件(常是listener.ora文件),添加或修改相应的服务名称和监听地址,然后重新启动监听程序。 请注意,解决ORA-12514错误可能因具体情况而异。如果以上方法都没有解决问题,建议参考引用中提供的图文解决教程或者阅相关文档进行更深入的排和解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值