oracle串連常見的有帶LOCAL=NO參數或帶LOCAL=YES的進程。
LOCAL=NO:非本地串連,即網路連接。它是通過Listener 串連到伺服器的。用戶端的應用通過用戶端的監聽向伺服器的監聽發送請求,伺服器的監聽接收後,在與資料庫連接,執行相關操作,在把結果返回給用戶端。這是通過監聽的流程。 所以在用戶端需要配置監聽,即配置tnsnames.ora。
LOCAL=YES:本地串連。 本地串連不走監聽,所以在服務監聽沒有啟動的情況下,通過本地的sqlplus 還是可以連上資料庫的。
[oracle@localhost ~]$ ps -aux | less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
oracle 469 0.0 0.4 10759972 320408 ? Ss May28 0:05 oracleorcl (LOCAL=NO)
oracle 495 1.2 10.1 10762344 7505684 ? Rs May28 356:58 oracleorcl (LOCAL=NO)
oracle 863 1.1 10.0 10762344 7455964 ? Ss May28 330:21 oracleorcl (LOCAL=NO)
如果應用使用持久串連的話(例如串連池),這些進程的存活時間應該是比較長的。
不過LOCAL=NO的進程還有一個現象就是,當用戶端崩潰的時候(例如plsql dev或toad無故死掉),我們只能結束程式,但oracle並不會自動釋放他們之間建立的監聽進程。沒有釋放的相關進程還是繼續佔用系統資源。所以對於這些已經無用的進程,我們可以把它kill掉。
更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/
下面指令碼是kill 掉連線時間超過3天的網路連接的進程。 把指令碼放在crontab裡,定時執行即可。不過在生產環境慎用!
kill.sh:
#!/bin/sh
ps -e -o pid -o etime -o args|grep oracle|grep LOCAL=NO|grep ->/tmp/tmpfile
#ps -e -o pid -o etime -o args|grep oracle|grep LOCAL=NO|grep -|awk '{print $2}'|awk -F: '{print $1}'
cat /tmp/tmpfile|while read LINE
do
TIME=`echo $LINE|awk '{print $2}'`
TIME=`echo $TIME|awk -F- '{print $1}'`
if [ $TIME -gt 3 ]
then
echo $LINE|awk '{print $1}'|xargs -t -n1 kill -9
fi
done
rm -f /tmp/tmpfile
本文出自 “richard的筆記-積微成著” 部落格,請務必保留此出處http://zxf261.blog.51cto.com/701797/756318