记录一次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.最后重启监听即可.

 

ORA-12518错误意味着监听程序无法处理客户机的连接请求。这个错误通常在数据库服务器上出现,表示数据库监听程序已达到其最大连接限制。 常见的原因是服务器资源不足,例如CPU或内存不足以处理所有连接请求。此外,网络延迟或故障也可能导致该错误。 解决这个问题的方法包括: 1. 增加监听程序的最大连接数:可以通过修改监听程序的配置文件(通常是listener.ora)来增加最大连接数。找到类似“max_connections”的参数并适当增加该值。 2. 增加服务器资源:通过增加服务器的CPU、内存等资源,可以提高服务器的处理能力,从而处理更多的连接请求。 3. 检查网络连接:查看网络连接是否稳定,并确保没有存在网络故障。可以尝试使用网络诊断工具,如ping命令,来检测网络延迟和丢包情况。 4. 优化数据库配置:通过优化数据库的配置参数,如连接池大小或连接超时时间,可以更有效地利用数据库资源,从而减少连接的负担。 5. 分析并限制不必要的连接:检查数据库的连接情况,排查是否有不必要的连接存在。可以通过查询数据库的v$session视图来获取连接信息,并关闭不需要的会话。 需要注意的是,解决ORA-12518错误可能需要一些系统维护和数据库管理的知识。如果没有相关的经验,建议寻求专业人士的帮助来解决这个问题,以防止对系统造成不良影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值