記錄一次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.最後重啓監聽即可.

 

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