在鏈接數據庫的時候,有時會遇到一個「ORA12514:監聽程序當前沒法識別鏈接描述符中請求的服務」的錯誤,這個錯誤其實就是數據庫動態註冊(關於動態註冊會在稍後講解)不生效,致使監聽器沒法識別客戶端鏈接符中提供的服務名,從而拒絕創建數據庫鏈接時報的錯誤信息,因此就須要對監聽器配置作修改。數據庫
在這裏,還需對問題進行細化,有時候可能會發現,在剛開啓監聽器的時候會發生這個錯誤,但過了一會再進行鏈接就不會報錯,這實際上是由於動態註冊須要時間,而剛開啓監聽器時,數據庫還未註冊到監聽器,致使報錯,這種狀況不在本文討論範圍內。服務器
listener.ora文件存放在$ORACLE_HOME/network/admin(以個人Oracle11爲例就是D:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN),這個文件存放的就是監聽器的配置,監聽器在啓動時會讀取該文件,咱們先來了解一下這個文件。blog
該文件的大概配置以下圖配置
上圖中,SID_LIST_LISTENER參數就是數據庫註冊,動態註冊或是靜態註冊(註冊就是將數據庫做爲一個服務註冊到監聽器。客戶端不須要知道數據庫名和實例名,只須要知道該數據庫對外提供的服務名就能夠申請鏈接到數據庫,動態註冊就是在監聽器配置文件中不明確的聲明數據庫實例和服務名,而是在數據庫啓動時才由數據庫自動註冊到監聽器,靜態註冊就是在監聽器配置文件中明確聲明數據庫實例和服務名。),LISTENER參數就是監聽器的配置,其中,PROTOCOL參數是協議名,通常爲TCP,HOST參數是地址,能夠寫IP地址、服務器名、localhost、127.0.0.1,PORT參數是端口號,默認爲1521。network
既然是由於動態註冊引發的問題,那麼最簡單的解決方法天然是由動態註冊改成靜態註冊,以下圖請求
紅線框內的就是靜態註冊,SID_NAME參數是數據庫實例名,GLOBAL_DBNAME參數是全局數據庫名(在配置客戶端的本地服務名時「服務名」要與全局數據庫名一致),配置好後,重啓監聽器,就可正常鏈接了。程序
修改成靜態註冊看起來雖簡單,但也有不足之處,首先,要修改成靜態註冊需對配置文件和參數較爲熟悉,不然頗有可能會配置錯誤,其次當參數的值有所改變時必須從新修改配置才行。方法
還有一種方法就是修改host參數的值,host參數能夠有四種值:IP地址、服務器名、localhost、127.0.0.1,因爲可取值變多了,致使瞭解決辦法也隨着致使出現問題的緣由而多樣化了起來,各類狀況均可能有不一樣的解決辦法,能夠在這四個值之間嘗試修改,須要注意的是,當採用localhost和127.0.0.1時,客戶端的本地服務名不能使用IP地址和服務器名進行配置,不然會報「ORA12541:無監聽程序」的錯誤,還有就是修改以後要重啓監聽器。im
以上的解決辦法只是我本身對這個錯誤的總結,可能尚沒法解決全部的狀況,歡迎進行討論。總結