|
怎么杀掉特定的数据库会话
Altersystemkillsession'sid,serial#';或者altersystemdisconnectsession'sid,serial#'immediate; 在win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程) 在Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程
一、问题的提出
很多的时候我们迅速的杀掉Oralcle的一些session,理由大体如下:
1、一些时候,由于我们的数据量很大,相应的事务大并且多,在做shutdownimmediate的时候会花费好多的时间,而我们却想用shutdownimmediate的方式,而又要把数据库迅速的shutdown下来。
2、我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网络发生的瞬断,从而就产生了一些死进程,他们的状态为Inactive的状态。当我们用altersystemkillsession‘sid,serial#’进行清除时,这些session的状态又变成了killed,这些就由Pmon进程来慢慢进行清除了,而你恰恰又是个急脾气。
3、系统忽然慢了现来,你发现是某个session在做怪,想迅速把它迅速结束掉。
二、处理方法 其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个session会对应着操作系统中相应的一个进程(process),我们不使用Altersystemkillsession这种方式了,取而代之则是kill的方式,当session的后台进程被杀掉了,便会促使懒散的Pmon进程迅速进行清理工作。
1、以一个session做以示例,
a、找到你要杀掉的那个session,并记下paddr
selectsid,username,paddr,statusfromv$session whereusername='用户名'and status='INACTIVE';
b、找到这个session所对应的spid
select*fromv$processwhereaddr='上面查寻的paddr'; c、杀掉spid所标识的那个进程
如果你的Oracle是在Unix平台上的,可以用kill。
$killspid
如果你的Oracle是在windown平台上的,有一些的不同,因为windown是以thead来代替process的,需要用到sid和spid两个值,所用的命令也由kill替换为Orakill,格式为rakillsidspid
C:\>orakillsid spid
d、再查一下v$session,看会话在不在了。
2、如何谋杀掉所有的Oracle的用户的进程呢?
a、windows的环境,执行如下图中的SQL,并把结果存成.bat的文件,比如kill.bat,执行一下kill.bat就可以了。
select'orakill'||sid||''||spidasthreadfrom sys.v_$processp,sys.v_$sessions wheresid>6and p.addr=s.paddr;
b、Unix的环境相对来说就简单多了,执行如下的命令就可以了
$ps-ef|grep$ORACLE_SID|grep-vora_|grepLOCAL=NO|awk'{print$2}'|xargskill
然后你再shutdownimmediate就很快的了。
有一些死锁进程,异常退出后用 altersystemkillsession'sid,serial#';无法释放会话 可从操作系统直接处理。
|
|
转载于:https://blog.51cto.com/welove/1297953