如何快速的杀掉 Oracle 的 Session
如何快速的杀掉 Oracle 的 Session
一、问题的提出很多的时候我们迅速的杀掉 Oralcle 的一些 session,理由大体如下:
1、 一些时候,由于我们的数据量很大,相应的事务大并且多,在做 shutdown immediate 的时候
会花费好多的时间,而我们却想用 shutdown immediate 的方式,而又要把数据库迅速的 shutdown
下来。
2、 我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网
络发生的瞬断,从而就产生了一些死进程,他们的状态为 Inactive 的状态。当我们用 alter system kill
session ‘sid,serial#’进行清除时,这些 session 的状态又变成了 killed,这些就由 Pmon 进程来慢慢进
行清除了,而你恰恰又是个急脾气。
3、 系统忽然慢了现来,你发现是某个 session 在做怪,想迅速把它迅速结束掉。
二、处理方法其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个 session 会对应着
操作系统中相应的一个进程(process),我们不使用 Alter system kill session 这种方式了,取而代之则
是 kill 的方式,当 session 的后台进程被杀掉了,便会促使懒散的 Pmon 进程迅速进行清理工作。
1、 以一个 session 做以示例,
a、 找到你要杀掉的那个 session, 并记下 paddr
b、 找到这个 session 所对应的 spid
c、 杀掉 spid 所标识的那个进程
♀如果你的 Oracle 是在 Unix 平台上的,可以用 kill。
$kill 13824
♀如果你的 Oracle 是在 windown 平台上的,有一些的不同,因为 windown 是以 thead 来代替
process 的,需要用到 sid 和 spid 两个值,所用的命令也由 kill 替换为 Orakill,格式为:orakill sid spid
C:\>orakill 94113824
d、 再查一下 v$session,看会话在不在了。
2、 如何谋杀掉所有的 Oracle 的用户的进程呢?
a、 windows 的环境,执行如下图中的 SQL,并把结果存成.bat 的文件,比如 kill.bat, 执行一下
kill.bat 就可以了。
b、 Unix 的环境相对来说就简单多了,执行如下的命令就可以了
$ ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill
然后你再 shutdown immediate 就很快的了。