比較orale的tnsping與TCP/IP的ping命令
Oracle Net 工具(命令)tnsping是一個OSI會話層的工具它用來
)驗證名字解析(name resolution當然是oracle自己的網絡服務名)
)遠程的listener是否啟動
在驗證上面兩項功能方面它是DBA手頭上一個比較得心應手的工具Oracle 網絡接口支持不同的網絡與傳輸協議其中我們最熟悉的就是TCP/IP這篇文章只描述TCP/IP 協議族然而在oracle網絡接口支持的其它協議下tnsping的功能是一樣的
Tnsping 可以用在多個網絡協議上但是本文只討論TCP/IP網絡協議
ORACLE TNSPING
Oracle的tnsping測試程序在通訊時使用TCP協議TCP 是面向連接的OSI傳輸層協議面向連接的協議在初始建立連接的階段需要進行初始的序列號的交換這就是我們通常所指的三次握手即tnsping測試程序在與listener進行通訊時會產生三次握手現象
當在命令行中發出了tnsping命令後會執行oracle 網絡別名(即網絡服務名主機連接字符串)的解析工作這個解析工作會在本地的tnsnamesora文件或ORACLE的命令服務器或ORACLE LDAP(目錄服務)中進行解析的目的是得到目標listener所在的機器名(IP地址)和listener偵聽的端口號
一旦得到listener的機器名與端口號就可以打開一個到目標機器與端口的TCP連接為了打開這個TCP連接listener的機器名必須被解析為ip地址(當然這只有在解析出的listener的連接地址為機器名時才這樣做)然後TCP/IP執行三次握手來完成這次連接
在連接建立之後Tnsping工具然後就發送一個Oracle TNS 連接包給Oracle ListenerListener然後就回應一個TNS 拒絕包(Refuse packet)在兩個機器間的TCP/IP連接就結束了從oracle 網絡別名的解析到結束TCP/IP連接之間的總的耗費的時間就顯示在tnsping命令的輸出中
一個例子
C\>tnsping V
TNS Ping Utility for bit Windows
Version Production on MAY
(c) Copyright Oracle Corporation All rights reserved
Attempting to contact
ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=))
OK ( msec)
OK ( msec)
OK ( msec)
OK ( msec)
上面這個例子顯示第一次tnsping需要毫秒這些時間由在tnsnamesora文件中解析V網絡別名需要的時間利用DNS解析listener機器名 abadah需要的時間三次TCP/IP握手需要的時間TNS Connect 和Refuse packets傳輸需要的時間斷開TCP/IP連接需要的時間第二次tnsping只花費了毫秒這是因為所有的信息 (V別名與IP地址)都已經在cache中了然而Tnsping程序仍然做 TCP的連接與斷開操作
TCP/IP PING
Transmission Control Protocol/Internet 協議族 (TCP/IP) 有一個稱為ping的工具它是到TCP/IP 協議族中ICMP(Internet Control Message Protocol)協議的命令行接口
根據RFC
有時候一個網關或目的地址需要同源地址進行通訊如為了給源地址一個關於在處理數據報的過程中產生的錯誤為了這種目的就需要使用ICMP協議 ICMP需要網際協議(IP)的支持這使它看起來就像一個更高層的協議然而ICMP實際上是IP的一個組成部分在IP的每個模塊中必須實現它
Ping命令的作用之一就是收集不同大小的IP數據包在網絡上傳輸一個來回需要的時間這可以用來估計網絡的大體性能和響應時間
Ping命令使用IP而不是TCP這樣就不需要TCP的次握手機制當運行ping命令時它只發送與接收一個ip數據包這比oracle的tnsping程序運行時需要更少的數據包
Ping的第一個的response time經常比平均response time要長這是因為第一次一般需要對ping的機器名進行解析這個解析可以通過本地的hosts文件DNS服務器或其它方法實現
一個ping的例子
Pinging [] with bytes of data
Reply from AAABBBCCCDDD bytes= time<ms TTL=
Reply from AAABBBCCCDDD bytes= time<ms TTL=
Reply from AAABBBCCCDDD bytes= time<ms TTL=
Reply from AAABBBCCCDDD bytes= time<ms TTL=
上面的例子顯示第一次的ping時間需要毫秒這包括DNS解析的時間
從上面的介紹我們可以得出
tnsping需要使用TCP所以需要次握手建立連接而ping只使用IP所以不需要次握手這也就解釋了為什麼有的機器不能ping通但是用tnsping確能測試通
Tnsping通並不能說明客戶端能與數據庫建立連接因為
ping通只能說明客戶端能解析listener的機器名而且lister也已經啟動但是並不能說明數據庫已經打開而且tsnping的過程與真正客戶端連接的過程也不一致
但是如果不能用tnsping通則肯定連接不到數據庫
關於第條可以用tns錯誤來說明
TNS (ORA) Connect failed because target host or object does not exist
原因
客戶端不能正確解析服務器的機器名該錯誤一般出現在客戶端沒有設置或沒有正確設置域名服務器的情況下出現
解決辦法
疑問出現這種情況時有時可以用tnsping 測程序測試網絡服務名可以通過但還是不能用程序連接數據庫你會感到很奇怪有時即使將客戶端的tnsnamesora中的服務器的機器名換為ip地址還是會報錯這會令人感到更加疑惑會不會系統有問題?
要真正解決這個問題需要知道客戶端與服務器端在建立連接時所的數據流並需要了解redirect session的概念
當一個客戶端連接在window上的數據庫或以共享連接的模式連接在unix上的數據庫時(此時數據庫為MTS模式)客戶端的連接會發生重定向現象也就是listener在接受客戶端的連接後會發送一個重定向的包給客戶端然後客戶端利用這個重定向包中提供的信息(服務器的ip(或機器名)和端口等信息)重新發起一個真正的到數據庫的連接當將客戶端的tnsnamesora中的服務器的機器名換為ip地址客戶端的連接還是會報ora 錯的罪魁禍首就是這個重定向包中的內容
當客戶端連接window上的數據庫或以共享連接的模式連接在unix上的數據庫時因為tnsnamesora中為服務器的ip地址所以不存在名字解析的問題客戶端的連接請求會到達listener這也就是tnsping 測試程序測試網絡服務名可以通過的原因因為tnsping測試程序不會產生重定向問題在listener接受客戶端的連接後會跟據客戶請求的連接模式(專用連接還是共享連接)和操作系統對socket的實現的情況決定是否需要將客戶端的連接進行重定向如果需要進行重定向則會產生一個重定向包該包中包含的服務器的地址信息為從listenerora文件中得到的listener偵聽的地址(根據listenerora中的配置可能為服務器的機器名也可能為服務器的ip地址)該包中還包含客戶端應該重定向連接的端口信息(同listener偵聽的端口可能不為同一個)客戶端在收到這個重定向包後解析出應該重新連接的服務器地址(機器名或ip)和端口重新利用解析出的信息建立一個新的連接此時如果客戶端得到的為服務器的機器名並且沒有配置域名解析就會因為解析不出服務器的ip地址從而導致產生ora錯誤
所以如果如果要徹底解決ora錯誤需要
) 配置一個域名服務器並正確的設置客戶端機器的域名服務器
) 將服務器的機器名與ip配置在客戶端的hosts文件中
) 將客戶端tnsnamesora和listenerora中的地址部分都改為ip地址而不是用機器名
) 將客戶端的連接改為專用連接這樣會避免redirect 現象(適用與客戶端tnsnamesora中為服務器的ip地址的情況下)
From:http://tw.wingwit.com/Article/program/Oracle/201311/18214.html