使用shell脚本检测数据库连接访问情况(r10笔记第98天)

时间:2022-05-05
本文章向大家介绍使用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