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

解決 ORA-12514: TNS 監聽程序無法識別服務 — SID 與 SERVICE_NAME 差異詳解

     編輯:Oracle 教學

解決 ORA-12514: TNS 監聽程序無法識別服務 — SID 與 SERVICE_NAME 差異詳解

遠端連線 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)

-- 成功配置 (使用 SID)
yanzhao_orcl =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 220.194.59.37)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = orcl)
    )
  )

核心概念:SID vs SERVICE_NAME

屬性SID (System Identifier)SERVICE_NAME
定義資料庫實例名稱 (Instance Name)全域資料庫服務名稱 (Global Database Name)
決定來源參數 instance_name 或環境變數 ORACLE_SIDlistener.ora 中 GLOBAL_DBNAME 或 service_names 參數
用途識別特定實例 (單實例/每個 RAC 節點不同)識別邏輯服務 (可跨多實例負載均衡、故障轉移)
連線語法(SID=...)(SERVICE_NAME=...)

排查步驟

  1. 在資料庫端執行:SHOW PARAMETER instance_name、SHOW PARAMETER service_names 確認實際值。
  2. 檢查 listener.ora 中 SID_LIST_LISTENER 區段註冊的 SID_NAME 或 GLOBAL_DBNAME。
  3. 客戶端 tnsnames.ora 對應修改為匹配的 SID 或 SERVICE_NAME。
  4. 重新載入監聽:lsnrctl reload,再測試連線。

最佳實踐

  • 生產環境建議使用 SERVICE_NAME,支援 RAC、Data Guard 角色切換、負載均衡。
  • 確保 service_names 參數與 listener.ora GLOBAL_DBNAME 一致。
  • 若必須用 SID (如舊版驅動),在 listener.ora 明確註冊 SID_LIST。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved