比較orale的tnsping與TCP/IP的ping指令:
--------------------------------------------------------------------------------------------------------------------------------
orale的tnsping
Oracle Net 工具(指令)tnsping,是一個OSI會話層的工具,它用來:
1)驗證名字解析(name resolution,當然是oracle自己的網絡服務名)
2)遠端的listener是否啟動
在驗證上面兩項功能方面,它是DBA手頭上一個比較得心應手的工具。Oracle 網絡接口支援不同的網絡與傳輸協定,其中我們最熟悉的就是TCP/IP。這篇文章隻描述TCP/IP 協定族,然而,在oracle網絡接口支援的其它協定下,tnsping的功能是一樣的。
Tnsping 可以用在多個網絡協定上,但是本文隻讨論TCP/IP網絡協定
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)
上面這個例子顯示第一次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
上面的例子顯示第一次的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位址的情況下)