1. 程式人生 > 其它 >使用shell指令碼檢測資料庫連線訪問情況(r10筆記第98天)

使用shell指令碼檢測資料庫連線訪問情況(r10筆記第98天)

最近要遷移幾套環境,涉及的資料庫有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