最近在為客戶做監控系統、數據庫的項目,用的是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是數據庫實例的名字,每個實例各不相同。