ORACLE进程清理


转载时请务必以超链接形式标明文章 原始出处和作者信息及本版权声明
链接:http://www.dbasky.net/archives/2009/04/oracle-4.html
oracle在做alter system kill session 'sid,serial#'时,如果被杀掉的session占有锁资源,则oracle要先去释放该锁,如果锁未能释放,
  oracle将不会去修改v$session中的paddr值,所以,当输入alter system kill session命令后,有2种返回结果,如果是正常资源释放了,将返回
  System altered.如果仍然有锁资源,将返回ORA-00031: session marked for kill,此时就要区别对待了:
  1)返回ORA-00031: session marked for kill 查看v$locked_object,如果被杀进程仍然占有锁资源,则可直接根据v$session中的paddr去
    v$process中找到对应的os进程,kill -9 ,如下:
    查看锁资源:
    select t2.username,t2.sid,t2.serial#,t2.logon_time,t1.object_id,t1.process,t1.locked_mode
    from   v$session t2 , v$locked_object t1
    where  t1.session_id=t2.sid order by t2.logon_time ;
    找到对应OS进程:
    select a.spid
    from v$process a , v$session b
    where a.addr=b.paddr and b.sid=&sid ;
    PS:可以通过这个语句查看详细点的信息
    select object_name ,machine,s.program,s.sid,s.serial#,p.spid
    from v$locked_object l,dba_objects o ,v$session s ,v$process p
    where l.object_id=o.object_id
    and l.session_id=s.sid
    and s.paddr=p.addr;
  2)返回System altered如果已经没有锁定资源,但是SESSION状态仍然为KILLED,想彻底清除该进程,因为此时V$SESSION中的PADDR值一被更改,
    无法根据它来找到对应的真实的OS进程,需要做其他处理,基本思路为要找到原SESSION的真实PADDR,根据它去V$PROCESS中找到真实的系统
    进程,然后KILL -9.
    找到已经被KILL的SESSION的真实PADDR:
    select p.addr from v$process p where pid <> 1
    minus
    select s.paddr from v$session s;
    根据这个真实的PADDR,查询真实的OS ID
    select spid
    from   v$process
    where  addr = &addr ;

   从主机杀所有外部连接:
    ps -ef | grep oracle | grep 'LOCAL=NO' | grep -v grep | awk '{ print $2}' | xargs kill -9

发表评论

Close