ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor 是 Oracle 連接故障 TOP 3。本文梳理靜態註冊缺失、動態註冊失敗、服務名不匹配三大根因,給出分級修復方案與驗證腳本。
客戶端 tnsnames.ora 指定 SERVICE_NAME=ORCL,發起連接 → 監聽器檢查內部服務表 → 未找到 ORCL → 拋出 12514。核心在於:監聽器不知道「ORCL」這個服務由哪個實例提供。
適用場景:數據庫未啟動/掛起/未向監聽器動態註冊(如 Data Guard 物理備庫、冷備份恢復後、監聽器比實例晚啟動)。
$ORACLE_HOME/network/admin/listener.oraSID_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
適用場景:實例已啟動,但 lsnrctl services 顯示無服務或服務狀態 UNKNOWN。
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;/etc/hosts 需包含 IP 短主機名 FQDN,確保 SELECT UTL_INADDR.GET_HOST_ADDRESS FROM DUAL 返回正確 IP。tnsping 監聽器?監聽器日誌 $ORACLE_BASE/diag/tnslsnr/.../trace/listener.log 是否有 TNS-12545 / TNS-12560?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...
三者易混淆,對應關係:
| 參數 | 來源 | 用途 |
|---|---|---|
SERVICE_NAME | tnsnames.ora (客戶端) | 連接描述符標識服務,可對應多實例(RAC/Primary-Standby) |
SID | tnsnames.ora (客戶端) | 連接描述符標識具體實例,單實例常用 |
GLOBAL_DBNAME | listener.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=。若 lsnrctl status 顯示 The listener supports no services 且 Windows 服務 OracleOraDb19c_home1TNSListener 狀態為 Stopped,根因單純是監聽器服務未啟動。
修復:net start OracleOraDb19c_home1TNSListener 或 lsnrctl start。
STARTUP 並 OPEN。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 即可從「疑難雜症」降級為「例行巡檢項」。