遠端連線 Oracle 時遇到 ORA-12514,tnsping 正常但 PL/SQL Developer 連線失敗。核心原因:tnsnames.ora 中使用 SERVICE_NAME,但資料庫實際註冊的是 SID (或相反),兩者不匹配。
-- 失敗配置 (使用 SERVICE_NAME)
yanzhao_orcl =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 220.194.59.37)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
-- 成功配置 (使用 SID)
yanzhao_orcl =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 220.194.59.37)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID = orcl)
)
)
| 屬性 | SID (System Identifier) | SERVICE_NAME |
|---|---|---|
| 定義 | 資料庫實例名稱 (Instance Name) | 全域資料庫服務名稱 (Global Database Name) |
| 決定來源 | 參數 instance_name 或環境變數 ORACLE_SID | listener.ora 中 GLOBAL_DBNAME 或 service_names 參數 |
| 用途 | 識別特定實例 (單實例/每個 RAC 節點不同) | 識別邏輯服務 (可跨多實例負載均衡、故障轉移) |
| 連線語法 | (SID=...) | (SERVICE_NAME=...) |
SHOW PARAMETER instance_name、SHOW PARAMETER service_names 確認實際值。listener.ora 中 SID_LIST_LISTENER 區段註冊的 SID_NAME 或 GLOBAL_DBNAME。tnsnames.ora 對應修改為匹配的 SID 或 SERVICE_NAME。lsnrctl reload,再測試連線。SERVICE_NAME,支援 RAC、Data Guard 角色切換、負載均衡。service_names 參數與 listener.ora GLOBAL_DBNAME 一致。SID (如舊版驅動),在 listener.ora 明確註冊 SID_LIST。