使用shell指令碼檢測資料庫連線訪問情況(r10筆記第98天)
阿新 • • 發佈:2022-05-05
最近要遷移幾套環境,涉及的資料庫有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