首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

連線 Oracle 虛擬機遇 ORA-12154 解決實戰:TNS/Listener 精準定位法 連線 Oracle 虛擬機遇 ORA-12154 解決實戰:TNS/Listener 精準定位法

     編輯:Oracle 資料庫基礎

錯誤現象

本機安裝 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。

三步驟精準定位

Step 1:在 VM 內確認 Listener 實際註冊的服務名

[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`)。

Step 2:VM `listener.ora` 若需自訂服務名,加入 SID_LIST

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` 重新載入。

Step 3:本機 `tnsnames.ora` 精確對應服務名

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 實際 IPClient 端解析需可路由到 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,定位問題才是最快解決之道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved