最近在为客户做监控系统、数据库的项目,用的是Zabbix平台。在最终实施的时候,发现有的Oracle数据库可以正常连接,有的报错……
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the client was:
在咨询过数据库运维人员发现,有的数据库给的是SID,有的给的是Service Name。而jdbc连接数据库有三种方式。
1. ServiceName方式
这种方式是Oracle推荐的,对于集群来说,每个节点的SID可能不一致,但ServiceName是一致的,包含所有节点。
ServiceName连接方式,是在Oracle 8i之后加入的。
jdbc:oracle:thine:@<host>:<port>/<ServiceName>
2. SID方式
这是我们在部署的时候预置的连接方式,格式为:
jdbc:oracle:thine:@<host>:<port>:<SID>
3. TNSName方式
TNSName连接方式是在Oracle 10.2.0.1之后加入的。
jdbc:oracle:thin:@<TNSName>
4. ServiceName和SID的区别
ServiceName是由oracle8i引进的。在Oracle 8i以前,使用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name参数,该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为Db_name. Db_domain,即等于Global_name。一个数据库可以对应多个Service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即不必Service name 必须与SID一样。
SID是数据库实例的名字,每个实例各不相同。