首页 > 代码库 > ora-12514 tns 监听程序无法识别连接描述符中请求的服务

ora-12514 tns 监听程序无法识别连接描述符中请求的服务

今天,远程连接linux服务器时遇到这样一个错误,tnsnames.ora 和 listener.ora文件配置都没有错误 但是就是连接不上  tnsping 也是正常的  但用plsql连接的时候总是报错 ora-12514 tns 监听程序无法识别连接描述符中请求的服务,因为连接本地数据库时没有问题的 所以监听程序应该没问题,接下来就查看tnsnames.ora 发现还是这里出了问题,其实报错报的已经说的很明确了 无法识别连接描述符中请求的服务 说明SID 和 服务名 是不一样的 我把 SERVICE_NAME 改成了SID  然后重启了监听程序 连接成功


以下是连接失败时候的tnsnames.ora文件


yanzhao_orcl =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 220.194.59.37)(PORT = 1521))
    (CONNECT_DATA =http://www.mamicode.com/
     (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

修改后的tnsnames.ora文件

yanzhao_orcl =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 220.194.59.37)(PORT = 1521))
    (CONNECT_DATA =http://www.mamicode.com/
     (SERVER = DEDICATED)
      (SID= orcl)
    )
  )

tnsping的截图

技术分享

写到这里 就去网上查了一下 SID和server_name 的关系

在oracle中SID必须等于instance_name(实例名) 这里可以简单的记作 SID就是实例名  

1. SID是实例名,实例名指的是用于响应某个数据库操作的数据库管理系统的名称。实例名是由初始化参数文件的参数instance_name决定的。如果这个参数不被指定(即instance_name没有被指定为任何值),那么实例的名字由该用户的环境变量ORACLE_SID(注意这里是大写)决定。在windows平台下,则是注册表中oracle_sid值决定。

2. SERVICE_NAME指的是listener中的全局数据库名:这个名字是由listener.ora中GLOBAL_DBNAME参数决定的。这个名字代表的是客户端连接到数据库时,tnsnames.ora中SERVICE_NAME参数所对应的值。

3. 连接字符串
    配置tnsname.ora时,可以用SID,也可以用SERVICE_NAME.  注意这两个值不一定相同,具体要看数据库服务器中的配置。
问题就出在第三点这里,如果SID和服务名一样  当然连接也不会出错,但如果不一样,就是报ora-12514 这个具体还要看服务器的配置信息。

关于instance_name/SID/server_name的区别  提供两篇文章供大家参考
1、http://blog.chinaunix.net/uid-23072872-id-35661.html
2、http://www.zhetao.com/content240
谢谢大家~~

ora-12514 tns 监听程序无法识别连接描述符中请求的服务