« Why My server Down? | Blog首页 | Oracle HowTo:如何在Oracle10g中启动和关闭OEM »
Oracle HowTo:如何快速杀死占用过多资源(CPU,内存)的数据库进程
作者:eygle | 【转载请注出处】|【云和恩墨 领先的zData数据库一体机 | zCloud PaaS云管平台 | SQM SQL审核平台 | ZDBM 数据库备份一体机】
链接:https://www.eygle.com/archives/2005/10/oracle_howto_kill_session.html
很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程:链接:https://www.eygle.com/archives/2005/10/oracle_howto_kill_session.html
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 |
此时该进程被迅速清除。
历史上的今天...
>> 2010-10-27文章:
>> 2008-10-27文章:
>> 2006-10-27文章:
>> 2004-10-27文章:
历史上的今天...
>> 2010-10-27文章:
>> 2008-10-27文章:
>> 2006-10-27文章:
>> 2004-10-27文章:
By eygle on 2005-10-27 12:01 | Comments (8) | HowTo | 494 |
虽然session被kill且从v$session中消失,但有时候如果占用很多回滚段,其资源还需要等待oracle回滚释放。
回滚是没有办法避免的,我们上一次
http://www.eygle.com/archives/2005/10/whats_mean_pe_lock.html
出这个问题就是因为之前有一个事务回滚了n天:(
按照大侠在“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);
谢谢!
我用以下方法:
1.kill session for oracle DB
2.kill process for unix OS
3.alter system checkpoint, 这样就能把上面提到的"killed" session清除.
大大們..
我依照您提供的方式..仍無法釋放cpu也~ @@~ 還有沒有其他方式呢?
你把耗CPU的进程kill -9搞掉还不行啊?
按照大侠在“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);
谢谢!
panweiweb: 我想是由于先找到进程ID,然后kill session,最后kill进程。