錯誤現象
ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor
根因分析
tnsnames.ora 中的 SERVICE_NAME 未在目標數據庫實例向監聽器註冊;
- 若客戶端配置未變,則為服務端配置變更導致註冊失效。
註冊機制
- 實例參數
SERVICE_NAMES 決定註冊的服務名(默認 DB_NAME.DB_DOMAIN 或 DB_UNIQUE_NAME);
- PMON 進程定期(默認 60 秒)向監聽器註冊;
- 監聽器重啟後,實例需重新註冊。
解決步驟
- 檢查實例參數:
SHOW PARAMETER SERVICE_NAMES,確認包含客戶端使用的服務名;
- 若缺失,動態添加:
ALTER SYSTEM SET SERVICE_NAMES='orcl,myservice' SCOPE=BOTH;;
- 強制立即註冊:
ALTER SYSTEM REGISTER;(需 SYSDBA);
- 驗證監聽器狀態:
LSNRCTL STATUS 或 LSNRCTL SERVICES 查看已註冊服務;
- 客戶端測試:
TNSPING myservice、SQLPLUS user/pwd@myservice。
常見誘發場景
- 修改
DB_NAME/DB_DOMAIN 未同步 SERVICE_NAMES;
- 克隆數據庫未修改服務名導致衝突;
- 監聽器重啟後未等待 60 秒自動註冊即測試連接;
LOCAL_LISTENER 參數指向錯誤監聽器地址。