本機安裝 Oracle Client,虛擬機 (VM) 內安裝 Oracle 10g Server。本機 `tnsnames.ora` 設定 VM IP/SID,連線報錯:
ORA-12154: TNS:could not resolve the connect identifier specified
但 VM 內部用 PL/SQL Developer 連線正常;VM 內連本機資料庫也正常。
ORA-12154 90% 是 Client 端 TNS 設定錯誤,非 Listener 問題。 若 Listener 掛掉會報 ORA-12541/12514。
[oracle@vm ~]$ lsnrctl status
Services Summary...
Service "orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s)...
Service "test" has 1 instance(s). <-- 自訂服務名
Instance "test", status READY...
**關鍵:** 記下 `Service "..."` 顯示的名稱(如 `orcl`、`test`)。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = test) # 自訂服務名,供 Client 連線用
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = test)
)
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
)
)
修改後:`lsnrctl reload` 重新載入。
ORCL_VM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test) # 必須與 VM listener.ora GLOBAL_DBNAME 完全一致
)
)
C:\> tnsping ORCL_VM
TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0
...
OK (20 msec)
C:\> sqlplus scott/tiger@ORCL_VM
SQL*Plus: Release 10.2.0.1.0
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
| 錯誤設定 | 正確設定 | 說明 |
|---|---|---|
| Client 用 SID (`SID=orcl`) | Client 用 SERVICE_NAME (`SERVICE_NAME=test`) | 10g+ 建議統一用 Service Name,支援 RAC/Data Guard |
| VM listener.ora 無 GLOBAL_DBNAME | 加入 SID_DESC 指定 GLOBAL_DBNAME | 預設僅註冊 DB_NAME,自訂名稱需顯式宣告 |
| Host 用 `localhost` | Host 用 VM 實際 IP | Client 端解析需可路由到 VM |
| 防火牆擋 1521 | 雙向開放 1521 (VM `iptables` / Windows 防火牆) | `telnet vm_ip 1521` 驗證連通性 |
ORA-12154 解決核心:**Client `tnsnames.ora` 的 `SERVICE_NAME` 必須與 Server `listener.ora` 的 `GLOBAL_DBNAME` 完全一致**。先在 Server 執行 `lsnrctl status` 看真實註冊服務名,再回 Client 修正 TNS,最後 `tnsping` 驗證。切勿一上來就改註冊表、調參數、重裝 Client,定位問題才是最快解決之道。