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