eygle.com   eygle.com
eygle.com  
 

« Why My server Down? | Blog首页 | Oracle HowTo:如何在Oracle10g中启动和关闭OEM »

Oracle HowTo:如何快速杀死占用过多资源(CPU,内存)的数据库进程

作者:eygle |【转载时请务必以超链接形式标明文章和作者信息及本声明
链接:
站内相关文章|Related Articles
很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程:
alter system kill session 'sid,serial#';

但是此命令释放资源极为缓慢,具体可以参考:Oracle中Kill session的研究.
为了更快速的释放资源,通常我们使用如下步骤来Kill进程:
1.首先在操作系统级kill进程
2.在数据库内部kill session
这样通常可以快速中止进程,释放资源。

今天就遇到这样一个案例,其他朋友在数据库里kill session,可是长时间仍无效果:
[oracle@danaly ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 27 11:09:50 2005

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options

SQL> select sid,username,status from v$session;

       SID USERNAME                       STATUS
---------- ------------------------------ --------
....
       154 SCOTT                          KILLED
...

30 rows selected.

那按照我前面提到的步骤,首先查询得到该session对应的OS进程号:
SQL> select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=&sid);
Enter value for sid: 154
old   1: select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=&sid)
new   1: select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=154)

'KILL-9'||SPID
--------------------
kill -9 22702

SQL> !

在操作系统级kill该进程:
[oracle@danaly ~]$ ps -ef|grep 22702
oracle   22702     1  0 Oct25 ?        00:00:02 oracledanaly (LOCAL=NO)
oracle   12082 12063  0 11:12 pts/1    00:00:00 grep 22702
[oracle@danaly ~]$ kill -9 22702
[oracle@danaly ~]$ ps -ef|grep 22702
oracle   12088 12063  0 11:12 pts/1    00:00:00 grep 22702
[oracle@danaly ~]$ exit
exit

SQL> select sid,username,status from v$session;

       SID USERNAME                       STATUS
---------- ------------------------------ --------
...
       154 SCOTT                          KILLED
...

30 rows selected.

SQL> select sid,serial#,username from v$session where sid=154;

       SID    SERIAL# USERNAME
---------- ---------- ------------------------------
       154      56090 SCOTT

再次在数据库中kill该session,并指定immediate选项:
SQL> alter system kill session '154,56090' immediate;

System altered.

SQL> select sid,serial#,username from v$session where sid=154;

no rows selected

By eygle on 2005-10-27 12:01 | Comments (8) | Posted to HowTo | Edit |Pageviews:

相关文章 随机文章
  • Oracle中Kill session的研究
  • 关于shared pool的深入探讨(一)
    转载一则辛酸的幽默-买房
    2006 年终总结-有哪些梦想已经慢慢的实现?
    NetAPP iSCSI性能测试
    新生以及将生 等待以及期待
    网上相关主题:
    Google

    留言 (8)

    虽然session被kill且从v$session中消失,但有时候如果占用很多回滚段,其资源还需要等待oracle回滚释放。

    Posted by: 玉面飞龙 at October 28, 2005 11:00 AM

    回滚是没有办法避免的,我们上一次
    http://www.eygle.com/archives/2005/10/whats_mean_pe_lock.html

    出这个问题就是因为之前有一个事务回滚了n天:(

    Posted by: eygle at October 28, 2005 1:52 PM

    按照大侠在“Oracle中Kill session的研究”文章中介绍的,如果session被kill,那么企v$session得paddr将指向一个虚拟地址,那么为什么这里还可以通过addr&paddr进行关联呢?
    就是下面这句:
    select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=&sid);
    谢谢!

    Posted by: kingheap at December 18, 2005 7:47 AM

    我用以下方法:
    1.kill session for oracle DB
    2.kill process for unix OS
    3.alter system checkpoint, 这样就能把上面提到的"killed" session清除.

    Posted by: wuyongrui_001 at January 16, 2006 10:49 PM

    大大們..
    我依照您提供的方式..仍無法釋放cpu也~ @@~ 還有沒有其他方式呢?

    Posted by: ORACLE初學者 at December 15, 2006 11:27 AM

    你把耗CPU的进程kill -9搞掉还不行啊?

    Posted by: eygle at December 15, 2006 11:40 AM

    按照大侠在“Oracle中Kill session的研究”文章中介绍的,如果session被kill,那么企v$session得paddr将指向一个虚拟地址,那么为什么这里还可以通过addr&paddr进行关联呢?
    就是下面这句:
    select 'kill -9 '||spid from v$process where addr = (select paddr from v$session where sid=&sid);
    谢谢!

    Posted by: panweiweb at August 7, 2007 3:27 PM

    panweiweb: 我想是由于先找到进程ID,然后kill session,最后kill进程。

    Posted by: guest at September 17, 2007 12:10 PM

    发表留言:



    Remember Me?
    (输入验证码后方可评论,谢谢支持)



    CopyRight © 2004 eygle.com, All rights reserved.