使用shell指令碼檢測資料庫連線訪問情況

jeanron100發表於2016-11-30
    最近要遷移幾套環境,涉及的資料庫有Oracle,MySQL,數量還不少,能夠達到的目標就是整合後的伺服器縮減幅度達到70%,這樣一種遷移場景,就涉及到很多的網路連線情況,如果本身業務優先順序高,涵蓋的是全域性業務,那麼這個影響就會無限放大。所以對於網路連線情況的監控也尤為重要。
    其實對於這方面的內容,嚴格來說,DBA能夠根據防火牆資訊列表篩查到對應的應用伺服器IP,然後交由負責的專人來負責跟進就可以了,但是這個時候因為重重原因,我要ipositive一些。這件事情就希望我能夠有自己的資訊,不至於到了後面,資料庫遷移過去了,應用連不上去,然後大家再花一些時間來確認是之前就如此,還是因為修改不當導致。其實這種事情想想就挺悶的。
    那麼我就positive一些,怎麼樣得到客戶端的資料庫連線情況呢,這個過程中就要重點關注資料庫的連線情況,一種思路就是檢視監聽日誌,另外一種思路就是抓取網路的訪問情況。
我們兩者結合一下,可以提前收集這些訪問的資訊。
簡單想想,刷開膀子來幹,指令碼內容如下:
function get_conn_info
{
ORACLE_HOME=`cat /etc/oratab | tail -1 | awk -F: '{print $2}'`
DB_LISTEN_PORT=`grep -i PORT $ORACLE_HOME/network/admin/listener.ora|awk -F\( '{print $5}'|sed -e 's/PORT//g' -e 's/=//g' -e 's/)//g'`
for TMP_PORT in $DB_LISTEN_PORT
do
netstat -nalp|grep ESTABLISHED|awk '{print $5 "  " $4}'|grep $TMP_PORT|awk -F: '{print $4}'| sort|uniq|sed /^[[:space:]]*$/d|awk -v TMP_PORT=$TMP_PORT '{print $1" "TMP_PORT}'
done
}


get_conn_info  > conn_info.lst
while true
do
get_conn_info  > tmp_conn_info.lst
sdiff conn_info.lst tmp_conn_info.lst|grep \> |awk '{print $2" "$3}' >> diff.lst
sleep 60
done
我們從$ORACLE_HOME/network/admin下分析listener.ora,得到一個埠列表,比如1521,1522,1523等
然後拿著這些埠資訊去和網路訪問中的記錄去做匹配,如果有匹配的記錄,就記錄下來,如果有新增的資訊記錄,就寫入一個臨時檔案,把結果整合起來,這樣得到的列表就是一個持續更新的IP資訊列表,當然這個頻率我根據目前的業務情況做了改變,很多連線都是長連線,有部分是短連線,所以我就把這個頻率做了調整。目前是1分鐘收集一次。
檢視得到的連線資訊列表,這樣哪個埠訪問的,哪臺伺服器都是一目瞭然。
$ less conn_info.lst
10.11.1.158 1522
10.11.128.169 1523
10.11.133.82 1523
10.11.2.140 1525
10.11.2.145 1526

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

相關文章