记录一次ORA-12518找出连接失败的IP地址

ORA-12518:监听程序无法分发客户机连接

这个错误很简单,原因是process被占满了.

一个客户凌晨突然报错,此客户的process值为4500,正常使用在1000左右,正常根本不可能出现进程数被占满的情况.

连接到服务器,杀掉几个会话之后快速登录到数据库,发现session数很少,但是process却很高.这个问题以前也遇到过,原因是进程连接到数据库,但是由于某种原因被拒绝了,没有产生会话.一般的原因是密码错误导致.参考我以前的文章:

https://blog.csdn.net/su377486/article/details/103113708

这次找到一个更快捷的办法找到产生大量垃圾连接的客户端IP地址.具体步骤如下:

1.快速杀死一些会话,使得你可以sysdba登录到数据库,参数命令:

ps -ef |grep LOCAL=NO |grep -v grep |awk '{print "kill -9",$2}'

试着kill一些,但是不要全部kill掉

2.使用下面的脚本,找出垃圾会话的spid

sqlplus -S / as sysdba <<EOF  >/dev/null
set pagesize 0 feedback off verify off heading off echo off term off trimspool on
spool spid.txt 
select spid from v\$process where addr in (select paddr from v\$session ); 
spool off 
EOF

ps -ef |grep LOCAL=NO |grep -v grep |awk '{print $2}' >all.txt
> kill.sh

while read line  
do
s1=`grep -w $line spid.txt|wc -l`
if [ "$s1" -eq 0 ]
then
  echo "kill -9 $line"  >>kill.sh
fi

done <all.txt

找出来的spid,放在kill.sh中,这些pid是在数据库的会话中没有的,但是在操作系统却有的,说明是垃圾无用进程.先不忙kill这些会话.

3.找出当前服务器上连接到数据库所有IP连接统计信息:

netstat -anp|grep 1521|grep -v grep |awk '{print $5}' |awk -F: '{print $1}' |sort|uniq -c|sort -nk1

例如结果如下,第一列表示连接的数据量,第二列表示连接的ip地址:

[root@tx_sh1 ~]#  netstat -anp|grep 1521|grep -v grep |awk '{print $5}' |awk -F: '{print $1}' |sort|uniq -c
      1 
      1 ]
      2 127.0.0.1
      2 180.111.212.60

一般上面的连接最多的IP就是可疑的ip了.

4.如果你需要再次确认,则可以使用下面的脚本:

sqlplus -S / as sysdba <<EOF >/dev/null
set pagesize 0 feedback off verify off heading off echo off term off trimspool on
spool spid.txt
select spid from v\$process where addr in (select paddr from v\$session );
spool off
EOF


netstat -anp|grep 1521|grep tcp|grep -v LISTEN|grep -v grep|sort -nk5 >s.temp
echo > ip.temp

while read line 
do
	ip=`echo $line |awk '{print $5}' |awk -F: '{print $1}'`
	pid=`echo $line |awk '{print $NF}' |awk -F/ '{print $1}'`
	s1=`grep -w $pid spid.txt|wc -l`
	if [ "$s1" -eq 0 ]
	then
		echo $ip >> ip.temp
	fi
done <s.temp
      

echo "Count |    Fail IP    "
echo "------+---------------"
cat ip.temp |uniq -c |sort -nk1

此脚本会打印出当前系统上每个IP连接数据库失败的进程的次数. 此脚本只统计连接失败的进程.

5.最后我们可以检查有问题的服务器,把服务器关机,或者在tns中添加黑名单,屏蔽此IP

添加黑名单方法,修改sqlnet.ora

tcp.validnode_checking=yes
tcp.excluded_nodes=(192.168.220.1)

在tcp.excluded_nodes中添加屏蔽的IP.最后重启监听即可.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章