使用shell脚本检测数据库连接访问情况(r10笔记第98天)
Posted 杨建荣的学习笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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
以上是关于使用shell脚本检测数据库连接访问情况(r10笔记第98天)的主要内容,如果未能解决你的问题,请参考以下文章