Oracle客戶端連接報錯ORA-12545問題的解決辦法
問題背景:
用戶在客戶端服務(wù)器通過sqlplus通過scan ip登陸訪問數(shù)據(jù)庫時,偶爾會出現(xiàn)連接報錯ORA-12545: Connect failed because target host or object does not exist的情況。
問題分析:
首先,登陸到連接有問題的客戶端數(shù)據(jù)庫上,通過sqlplus進(jìn)行多次連接測試,的確會出現(xiàn)用戶所說的ORA-12545: Connect failed because target host or object does not exist報錯現(xiàn)象,此外,還發(fā)現(xiàn)登陸成功的節(jié)點(diǎn)顯示的實(shí)例都是節(jié)點(diǎn)一實(shí)例servicedb1
檢查數(shù)據(jù)庫的listener_scan監(jiān)聽配置,服務(wù)servicedb下動態(tài)注冊了(ready)兩個實(shí)例servicedb1以及servicedb2,沒有其他的配置實(shí)例
接下來,獲取客戶端連接報錯的具體trace信息,需要在客戶端的服務(wù)器的sqlnet.ora里面配置跟蹤參數(shù),對客戶端的連接過程進(jìn)行跟蹤
TRACE_LEVEL_CLIENT=16 TRACE_DIRECTORY_CLIENT=/tmp TRACE_UNIQUE_CLIENT=ON DIAG_ADR_ENABLED =OFF
配置完跟蹤參數(shù)之后,再一次通過sqlplus連接scan ip訪問數(shù)據(jù)庫,每一次登陸都會在/tmp目錄下面生成登陸的跟蹤trc文件cli_xxxx.trc ,打開發(fā)生ORA-12545:報錯時的trc文件
從trc文件里面,我們看到了發(fā)生解析主機(jī)錯誤(hostname lookup failure!)的主機(jī)連接地址nsc2addr: (ADDRESS=(PROTOCOL=TCP)(HOST=servicedb2)(PORT=1521))
該地址是客戶端在連接scan監(jiān)聽之后,返回給客戶端的本地監(jiān)聽服務(wù)連接地址,因?yàn)閟can 監(jiān)聽上的服務(wù)是數(shù)據(jù)庫通過遠(yuǎn)程注冊進(jìn)去的(remote listener),客戶端在連接scan監(jiān)聽上的服務(wù)之后,scan監(jiān)聽會再把負(fù)載較小節(jié)點(diǎn)所在的本地監(jiān)聽(local listener)地址返回給客戶端,客戶端再訪問這個監(jiān)聽地址去連接數(shù)據(jù)庫
從這個返回報錯地址nsc2addr我們可以看到里面的地址信息host返回的是主機(jī)名而不是實(shí)際的IP地址,查看客戶端的/etc/hosts配置,可以看到只配置了節(jié)點(diǎn)一的主機(jī)名IP地址解析,并沒有配置節(jié)點(diǎn)二的主機(jī)名IP地址解析,也沒有配置dns去解析這個主機(jī)名,從而導(dǎo)致一旦scan 監(jiān)聽分配到節(jié)點(diǎn)二給客戶端時就會出現(xiàn)了ORA-12545: Connect failed because target host or object does not exist的報錯,而分配到節(jié)點(diǎn)一客戶端可以連接成功,因?yàn)閔osts里面有節(jié)點(diǎn)一的主機(jī)名IP地址解析
接下來繼續(xù)分析scan監(jiān)聽返回的地址信息host為主機(jī)名的原因,查看數(shù)據(jù)庫的scan監(jiān)聽的服務(wù)配置信息lsnrctl services listener_scan1
可以看到scan監(jiān)聽下的服務(wù)servicedb注冊的實(shí)例servicedb1,servicedb2的遠(yuǎn)程服務(wù)(remote server)地址的連接信息都是直接的服務(wù)器主機(jī)名(host=servicedb1)以及(host=servicedb2),不是實(shí)際的IP地址信息,這也是為什么客戶端接收到的地址nsc2addr里面不是IP地址信息的原因,因?yàn)閿?shù)據(jù)庫注冊到scan監(jiān)聽服務(wù)的連接信息是主機(jī)名形式
show parameter查看數(shù)據(jù)庫的動態(tài)注冊配置參數(shù)local listener,該參數(shù)表示實(shí)例節(jié)點(diǎn)所注冊的本地監(jiān)聽地址,數(shù)據(jù)庫遠(yuǎn)程注冊到scan監(jiān)聽的服務(wù)會指向這個地址,我們可以看到由于參數(shù)local_listener的配置為空,因此數(shù)據(jù)庫注冊到scan監(jiān)聽服務(wù)的連接信息host就是默認(rèn)的服務(wù)器主機(jī)名
問題解決:
1 臨時解決方案,客戶端的/etc/hosts里面配置數(shù)據(jù)庫節(jié)點(diǎn)二主機(jī)的IP解析條目,需要注意的是,這個方式只是解決了該客戶端的訪問數(shù)據(jù)庫的問題,如果其他客戶端沒有配置hosts或者dns去解析數(shù)據(jù)庫服務(wù)器的主機(jī)名,依然會出現(xiàn)ORA-12545: Connect failed because target host or object does not exist的情況
2 完整解決方案,數(shù)據(jù)庫兩個節(jié)點(diǎn)動態(tài)注冊參數(shù)local_listener配置為兩個節(jié)點(diǎn)的VIP連接信息
節(jié)點(diǎn)一:(ADDRESS = (PROTOCOL=TCP)(HOST=xxx.xxx.xxx.13)(PORT=1521)),
節(jié)點(diǎn)二:(ADDRESS = (PROTOCOL=TCP)(HOST=xxx.xxx.xxx.74)(PORT=1521))
這樣返回給客戶端的是IP的形式而非主機(jī)名,全部客戶端就可以不用配置hosts或者dns去解析數(shù)據(jù)庫服務(wù)器的主機(jī)名
總結(jié)
到此這篇關(guān)于Oracle客戶端連接報錯ORA-12545問題的解決辦法的文章就介紹到這了,更多相關(guān)Oracle客戶端連接報錯ORA-12545內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle報存儲過程中調(diào)用DBLink同義詞出現(xiàn)錯誤:PLS-00201: 必須聲明標(biāo)識符
這篇文章主要介紹了Oracle報存儲過程中調(diào)用DBLink同義詞出現(xiàn)錯誤:PLS-00201: 必須聲明標(biāo)識符的相關(guān)資料,需要的朋友可以參考下2018-03-03oracle存儲過程創(chuàng)建表分區(qū)實(shí)例
二種oracle存儲過程創(chuàng)建表分區(qū)實(shí)例2013-11-11Oracle數(shù)據(jù)庫"記錄被另一個用戶鎖住"解決方法(推薦)
數(shù)據(jù)庫是一個多用戶使用的共享資源。當(dāng)多個用戶并發(fā)地存取數(shù)據(jù)時,在數(shù)據(jù)庫中就會產(chǎn)生多個事務(wù)同時存取同一數(shù)據(jù)的情況。這篇文章主要介紹了Oracle數(shù)據(jù)庫"記錄被另一個用戶鎖住"解決方法2018-03-03oracle數(shù)據(jù)庫中查看系統(tǒng)存儲過程的方法
這篇文章主要介紹了oracle數(shù)據(jù)庫中查看系統(tǒng)存儲過程的方法,需要的朋友可以參考下2014-06-06Oracle參數(shù)設(shè)置教程之set和reset的實(shí)用案例
最近在學(xué)習(xí)oracle,學(xué)習(xí)中遇到了一些覺著有必要記錄下的內(nèi)容,所以下面這篇文章主要給大家介紹了關(guān)于Oracle參數(shù)設(shè)置教程之set和reset實(shí)用案例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起看看吧。2017-10-10oracle誤刪數(shù)據(jù)表還原的二種方法(oracle還原)
這篇文章主要介紹了oracle誤刪數(shù)據(jù)表還原的二種方法,大家參考使用吧2014-01-01Oracle數(shù)據(jù)庫中外鍵的相關(guān)操作整理
這篇文章主要介紹了Oracle數(shù)據(jù)庫中外鍵的相關(guān)操作整理,包括對外鍵參照的主表記錄進(jìn)行刪除的操作方法等,需要的朋友可以參考下2016-01-01