首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle ORA-12514 徹底解決:監聽器未識別 SERVICE_NAME 的三大根因與修復

     編輯:Oracle 資料庫相關知識

ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor 是 Oracle 連接故障 TOP 3。本文梳理靜態註冊缺失、動態註冊失敗、服務名不匹配三大根因,給出分級修復方案與驗證腳本。

一、錯誤本質

客戶端 tnsnames.ora 指定 SERVICE_NAME=ORCL,發起連接 → 監聽器檢查內部服務表 → 未找到 ORCL → 拋出 12514。核心在於:監聽器不知道「ORCL」這個服務由哪個實例提供。

二、根因 1:缺失靜態註冊(SID_LIST_LISTENER)

適用場景:數據庫未啟動/掛起/未向監聽器動態註冊(如 Data Guard 物理備庫、冷備份恢復後、監聽器比實例晚啟動)。

修復:編輯 $ORACLE_HOME/network/admin/listener.ora

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =                    -- 新增:靜態註冊目標實例
      (GLOBAL_DBNAME = ORCL)       -- 必須與 tnsnames.ora 的 SERVICE_NAME 一致
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = ORCL)            -- 實例名($ORACLE_SID)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = your-host)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

生效:

lsnrctl stop
lsnrctl start
# 或熱加載
lsnrctl reload

三、根因 2:動態註冊失敗(PMON 註冊異常)

適用場景:實例已啟動,但 lsnrctl services 顯示無服務或服務狀態 UNKNOWN。

排查清單:

  1. LOCAL_LISTENER 參數:
    SHOW PARAMETER local_listener
    若為空,實例嘗試向默認 (ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=1521)) 註冊。若主機名解析錯誤或監聽器非默認端口,註冊失敗。
    修正:ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=correct-ip)(PORT=1521))' SCOPE=BOTH;
  2. 主機名解析:/etc/hosts 需包含 IP 短主機名 FQDN,確保 SELECT UTL_INADDR.GET_HOST_ADDRESS FROM DUAL 返回正確 IP。
  3. 防火牆/網絡:實例所在節點能否 tnsping 監聽器?監聽器日誌 $ORACLE_BASE/diag/tnslsnr/.../trace/listener.log 是否有 TNS-12545 / TNS-12560?
  4. PMON 進程:SELECT * FROM V$PROCESS WHERE PNAME='PMON'; 確認存活。

驗證動態註冊:

lsnrctl services
# 期望輸出:
# Service "ORCL" has 1 instance(s).
#   Instance "ORCL", status READY, has 1 handler(s) for this service...

四、根因 3:服務名不匹配(SERVICE_NAME vs SID vs GLOBAL_DBNAME)

三者易混淆,對應關係:

參數來源用途
SERVICE_NAMEtnsnames.ora (客戶端)連接描述符標識服務,可對應多實例(RAC/Primary-Standby)
SIDtnsnames.ora (客戶端)連接描述符標識具體實例,單實例常用
GLOBAL_DBNAMElistener.ora (靜態註冊)監聽器對外發布的服務名,必須與客戶端 SERVICE_NAME 一致
SERVICE_NAMES數據庫參數 (動態註冊)實例向監聽器發布的服務名列表,默認 DB_NAME.DB_DOMAIN

修正策略:

  • 統一採用 SERVICE_NAME 連接(支援 RAC/FAILOVER)。
  • ALTER SYSTEM SET SERVICE_NAMES='ORCL' SCOPE=BOTH; 確保動態註冊名正確。
  • 靜態註冊 GLOBAL_DBNAME=ORCL 與動態註冊 SERVICE_NAMES 保持一致。
  • 客戶端 tnsnames.ora 僅保留 SERVICE_NAME=ORCL,移除 SID=。

五、另一種現象:ORA-12514 伴隨「無監聽程序」

若 lsnrctl status 顯示 The listener supports no services 且 Windows 服務 OracleOraDb19c_home1TNSListener 狀態為 Stopped,根因單純是監聽器服務未啟動。
修復:net start OracleOraDb19c_home1TNSListener 或 lsnrctl start。

六、終極簡易修復法(適用 90% 單實例場景)

  1. 確認實例已 STARTUP 並 OPEN。
  2. 停止監聽器服務 → 停止數據庫服務 → 啟動數據庫服務 → 啟動監聽器服務。
  3. 實例啟動時 PMON 會自動向默認監聽器動態註冊,無需手改 listener.ora。

七、驗證腳本(納入巡檢)

#!/bin/bash
# check_listener_12514.sh
LISTENER_STATUS=$(lsnrctl status 2>&1 | grep -c "Service \"ORCL\"")
if [ $LISTENER_STATUS -eq 0 ]; then
  echo "[ALERT] Listener has no service ORCL" | mail -s "ORA-12514 Risk" dba@company.com
  lsnrctl services >> /tmp/listener_12514_diag.log
fi

掌握「靜態註冊托底、動態註冊為主、服務名統一」三原則,ORA-12514 即可從「疑難雜症」降級為「例行巡檢項」。

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