tnsping 的問題

偶然見看到一篇關於tnsping的文章,轉載以備日後查找

http://yhacky.blog.163.com/blog/static/3950121820094525059285/


比較orale的tnsping與TCP/IP的ping命令:

-----------------------------------------------------------------------------
Oracle Net 工具(命令)tnsping,是一個OSI會話層的工具,它用來:
1)驗證名字解析(name resolution,當然是oracle自己的網絡服務名)
2)遠程的listener是否啓動
         在驗證上面兩項功能方面,它是DBA手頭上一個比較得心應手的工具。Oracle 網絡接口支持不同的網絡與傳輸協議,其中我們最熟悉的就是TCP/IP。這篇文章只描述TCP/IP 協議族,然而,在oracle網絡接口支持的其它協議下,tnsping的功能是一樣的。

Tnsping 可以用在多個網絡協議上,但是本文只討論TCP/IP網絡協議
-----------------------------------------------------------------------------
ORACLE TNSPING
-----------------------------------------------------------------------------
         Oracle的tnsping測試程序,在通訊時使用TCP協議。TCP 是面向連接的OSI傳輸層協議。面向連接的協議在初始建立連接的階段需要進行初始的序列號的交換,這就是我們通常所指的三次握手。即tnsping測試程序在與listener進行通訊時會產生三次握手現象。

         當在命令行中發出了tnsping命令後,會執行oracle 網絡別名(即網絡服務名,主機連接字符串)的解析工作。這個解析工作會在本地的tnsnames.ora文件或ORACLE的命令服務器或ORACLE LDAP(目錄服務)中進行。解析的目的是得到目標listener所在的機器名(IP地址)和listener偵聽的端口號。

         一旦得到listener的機器名與端口號,就可以打開一個到目標機器與端口的TCP連接。爲了打開這個TCP連接,listener的機器名必須被解析爲ip地址(當然這只有在解析出的listener的連接地址爲機器名時才這樣做),然後TCP/IP執行三次握手來完成這次連接。

         在連接建立之後,Tnsping工具然後就發送一個Oracle TNS 連接包給Oracle Listener,Listener然後就迴應一個TNS 拒絕包(Refuse packet),在兩個機器間的TCP/IP連接就結束了。從oracle 網絡別名的解析到結束TCP/IP連接之間的總的耗費的時間就顯示在tnsping命令的輸出中。

一個例子:
C:\>tnsping V817   4
TNS Ping Utility for 32-bit Windows:  
Version 8.1.7.0.0 - Production on 18-MAY-2001 14:27:57
(c) Copyright 1997 Oracle Corporation.   All rights reserved.
Attempting to contact  
ADDRESS=(PROTOCOL=TCP)(HOST=abadah.us.oracle.com)(PORT=1521))
OK (1770 msec)
OK (10 msec)
OK (0 msec)
OK (10 msec)

         上面這個例子顯示第一次tnsping需要1770毫秒,這些時間由在tnsnames.ora文件中解析V817網絡別名需要的時間、利用DNS解析listener機器名” abadah”需要的時間,三次TCP/IP握手需要的時間、TNS Connect 和Refuse packets傳輸需要的時間、斷開TCP/IP連接需要的時間。第二次tnsping只花費了10毫秒,這是因爲所有的信息 (V817別名與IP地址)都已經在cache中了,然而Tnsping程序仍然做 TCP的連接與斷開操作。

-----------------------------------------------------------------------------
TCP/IP PING
-----------------------------------------------------------------------------
Transmission Control Protocol/Internet 協議族 (TCP/IP) 有一個稱爲ping的工具。它是到TCP/IP 協議族中ICMP(Internet Control Message Protocol)協議的命令行接口。
根據RFC 792:

"有時候,一個網關或目的地址需要同源地址進行通訊,如:爲了給源地址一個關於在處理數據報的過程中產生的錯誤。爲了這種目的,就需要使用ICMP協議。 ICMP需要網際協議(IP)的支持,這使它看起來就像一個更高層的協議,然而,ICMP實際上是IP的一個組成部分,在IP的每個模塊中必須實現它。

         Ping命令的作用之一就是收集不同大小的IP數據包在網絡上傳輸一個來回需要的時間。這可以用來估計網絡的大體性能和響應時間。

         Ping命令使用IP,而不是TCP,這樣就不需要TCP的3次握手機制,當運行ping命令時,它只發送與接收一個ip數據包,這比oracle的tnsping程序運行時需要更少的數據包。

         Ping的第一個的response time經常比平均response time要長,這是因爲第一次一般需要對ping的機器名進行解析。這個解析可以通過本地的hosts文件、DNS服務器或其它方法實現。

一個ping的例子:
Pinging abadah.us.oracle.com [144.25.223.156] with 32 bytes of data:
Reply from AAA.BBB.CCC.DDD: bytes=32 time<40ms TTL=255
Reply from AAA.BBB.CCC.DDD: bytes=32 time<10ms TTL=255
Reply from AAA.BBB.CCC.DDD: bytes=32 time<10ms TTL=255
Reply from AAA.BBB.CCC.DDD: bytes=32 time<10ms TTL=255

         上面的例子顯示第一次的ping時間需要40毫秒,這包括DNS解析的時間。

從上面的介紹我們可以得出:
1.tnsping需要使用TCP,所以需要3次握手建立連接,而ping只使用IP,所以不需要3次握手,這也就解釋了爲什麼有的機器不能ping通,但是用tnsping確能測試通。
2.Tnsping通,並不能說明客戶端能與數據庫建立連接。因爲
ping通只能說明客戶端能解析listener的機器名,而且lister也已經啓動,但是並不能說明數據庫已經打開,而且tsnping的過程與真正客戶端連接的過程也不一致。
但是如果不能用tnsping通,則肯定連接不到數據庫。

關於第2條可以用tns-12545錯誤來說明:
TNS-12545 (ORA-12545): Connect failed because target host or object does not exist
原因:
客戶端不能正確解析服務器的機器名。該錯誤一般出現在客戶端沒有設置或沒有正確設置域名服務器的情況下出現。
解決辦法:
疑問:出現這種情況時,有時可以用tnsping 測程序測試網絡服務名可以通過,但還是不能用程序連接數據庫,你會感到很奇怪。有時即使將客戶端的tnsnames.ora中的服務器的機器名換爲ip地址,還是會報錯,這會令人感到更加疑惑,會不會系統有問題?
         要真正解決這個問題,需要知道客戶端與服務器端在建立連接時所的數據流。並需要了解redirect session的概念。
         當一個客戶端連接在window上的數據庫,或以共享連接的模式連接在unix上的數據庫時(此時數據庫爲MTS模式),客戶端的連接會發生重定向現象,也就是listener在接受客戶端的連接後,會發送一個重定向的包給客戶端,然後客戶端利用這個重定向包中提供的信息(服務器的ip(或機器名)和端口等信息)重新發起一個真正的到數據庫的連接。當將客戶端的tnsnames.ora中的服務器的機器名換爲ip地址,客戶端的連接還是會報ora- 12545錯的罪魁禍首就是這個重定向包中的內容。
         當客戶端連接window上的數據庫,或以共享連接的模式連接在unix上的數據庫時,因爲tnsnames.ora中爲服務器的ip地址,所以不存在名字解析的問題,客戶端的連接請求會到達listener,這也就是tnsping 測試程序測試網絡服務名可以通過的原因,因爲tnsping測試程序不會產生重定向問題。在listener接受客戶端的連接後,會跟據客戶請求的連接模式(專用連接還是共享連接)和操作系統對socket的實現的情況,決定是否需要將客戶端的連接進行重定向,如果需要進行重定向,則會產生一個重定向包,該包中包含的服務器的地址信息爲從listener.ora文件中得到的listener偵聽的地址(根據listener.ora中的配置可能爲服務器的機器名,也可能爲服務器的ip地址),該包中還包含客戶端應該重定向連接的端口信息(同listener偵聽的端口可能不爲同一個),客戶端在收到這個重定向包後,解析出應該重新連接的服務器地址(機器名或ip)和端口,重新利用解析出的信息建立一個新的連接,此時如果客戶端得到的爲服務器的機器名並且沒有配置域名解析,就會因爲解析不出服務器的ip地址,從而導致產生ora-12545錯誤。
         所以,如果如果要徹底解決ora-12545錯誤,需要:
1) 配置一個域名服務器,並正確的設置客戶端機器的域名服務器
2) 將服務器的機器名與ip配置在客戶端的hosts文件中.
3) 將客戶端tnsnames.ora和listener.ora中的地址部分都改爲ip地址,而不是用機器名
4) 將客戶端的連接改爲專用連接,這樣會避免redirect 現象。(適用與客戶端tnsnames.ora中爲服務器的ip地址的情況下)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章