oracle kill 用户进程的方法

一、问题的提出       
很多的时候我们迅速的杀掉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       
    
select   sid,   username,   paddr,   status   from   v$session       
where   username   =   '用户名 '   and       
status   =   'INACTIVE ';       
    
b、   找到这个session所对应的spid       
    
select   *   from   v$process   where   addr   =   '上面查寻的paddr ';       
c、   杀掉spid所标识的那个进程       
    
如果你的Oracle是在Unix平台上的,可以用kill。       
    
$kill   spid       
    
如果你的Oracle是在windown平台上的,有一些的不同,因为windown是以thead来代替process的,需要用到sid和spid两个值,所用的命令也由kill替换为Orakill,格式为rakill   sid   spid       
    
C:\> orakill   sid    spid       
    
d、   再查一下v$session,看会话在不在了。       
    
2、   如何谋杀掉所有的Oracle的用户的进程呢?       
    
a、windows的环境,执行如下图中的SQL,并把结果存成.bat的文件,比如kill.bat,   执行一下kill.bat就可以了。       
    
select   'orakill   '||sid|| '   '||spid   as   thread   from       
sys.v_$process   p,   sys.v_$session   s       
where   sid   >   6   and       
p.addr   =   s.paddr   ;       
    
b、   Unix的环境相对来说就简单多了,执行如下的命令就可以了       
    
$   ps   -ef|grep   $ORACLE_SID|grep   -v   ora_|grep   LOCAL=NO|awk   '{print   $2} '|xargs   kill       
    
然后你再shutdown   immediate就很快的了。       
    
有一些死锁进程,异常退出后用       
alter   system   kill   session   'sid,   serial# ';无法释放会话       
可从操作系统直接处理。    

posted on 2012-12-24 11:44  ourstory is on the road  阅读(4970)  评论(0编辑  收藏  举报