oracle連接LOCAL=NO

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掉。


下面腳本是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

 

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