今天,远程连接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 =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
修改后的tnsnames.ora文件
yanzhao_orcl =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 220.194.59.37)(PORT = 1521))
(CONNECT_DATA =
(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
谢谢大家~~