對於tnsping的連線超時的功能補充

jeanron100發表於2016-05-18
tnsping,作為Oracle連線測試的一個小巧的工具,其實大家已經不陌生了,但是使用tnsping有一個問題,就是連線超時,當然這個和網路的安全策略等密不可分,但是擺在我面前的一個問題是,現在有大量的伺服器,每臺資料庫伺服器上都有tnsnames.ora,如果需要判斷tnsnames.ora裡面的配置是否生效,使用tnsping是一個很自然的選擇。
我也這麼做了,我寫了一個命令去解析tnsnames.ora 然後把裡面的連線物件給標示出來。
cat tnsnames.ora|awk '{print $1}'|grep  -iv 'ADDRESS\|ADDRESS_LIST\|CONNECT_DATA\|SERVICE_NAME\|SID\|SERVER\|)'|sed 's/=(DESCRIPTION//g'|grep -v 'DESCRIPTION\|#'|awk -F= '{print $1}'|sed '/^$/d' |grep -v \(
命令的輸出結果類似:
db133_95
csvip
testdb
我在這個基礎上就可以使用tnsping來判斷了。
但是剛開始我就發現這麼做還是有一個隱患,那就是不可避免的連線超時問題。我們可以簡單測試一下,看看預設的超時時長是多少?
$ time tnsping db84
TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 18-MAY-2016 22:17:53
Copyright (c) 1997, 2011, Oracle.  All rights reserved.
Used parameter files:
/U01/app/oracle/product/11.2.3/db_1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.11.17.84)(PORT = 1528)) (CONNECT_DATA = (SERVICE_NAME = sol)))
TNS-12535: TNS:operation timed out
real    1m0.011s
user    0m0.006s
sys     0m0.004s
透過time可以馬上定位出超時時長是1分鐘。
那麼對於很多執行已久,業務依賴性較高的系統,tnsnames.ora裡面的連線物件就非常多了,這個時候如果使用tnsping的方式那就很容易超時,假設裡面有100個連線物件,如果存在30個無效連線物件,那就需要30分鐘,如果有多臺伺服器,那就不用幹其他的活了。
對於tnsping,這個命令也沒有提供更多的使用選項,所以目前來看還無法指定超時時長。
$ tnsping --help
TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 18-MAY-2016 18:03:15
Copyright (c) 1997, 2011, Oracle.  All rights reserved.
Used parameter files:
/U01/app/oracle/product/11.2.3/db_1/network/admin/sqlnet.ora
TNS-03505: Failed to resolve name
$ tnsping -h
TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 18-MAY-2016 18:03:19
Copyright (c) 1997, 2011, Oracle.  All rights reserved.
Used parameter files:
/U01/app/oracle/product/11.2.3/db_1/network/admin/sqlnet.ora
TNS-03505: Failed to resolve name
這個還是依賴於系統級,那麼我們把tnsping先放一放。看看還有沒有其它的實現方式,一個很自然的實現方式就是telnet
一般測試連通性,我們可以使用telnet 伺服器IP  埠的方式。下面是一個測試成功的案例。
$ telnet 10.11.65.111 1528
Trying 10.11.65.111...
Connected to 10.11.65.111.
Escape character is '^]'.
Connection closed by foreign host.
對於連通性問題的場景,telnet貌似也沒有相應的超時選項。
所以使用telnet的方式和tnsping的效果差不多。
那麼還有什麼方式呢,這個時候我們可以好好想想還有那些系統級的工具可以滿足要求,NetCat就是一個不錯的選擇。
所以想到了,我二話沒說,就開始了測試。nc的一個亮點就是可以指定超時時長,比如我們設定為5秒,超時就顯示連線失敗
$ echo quit  | nc -w 5  -v 10.11.65.111 1521
Connection to 10.11.65.111 1521 port [tcp/ncube-lm] succeeded!
$ echo quit  | nc -w 5  -v 10.11.65.116 1521
nc: connect to 10.11.65.116 port 1521 (tcp) failed: No route to host
看來有了相應的解決思路,tnsping連線超時的問題就可以變通解決了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2102785/,如需轉載,請註明出處,否則將追究法律責任。

相關文章