EMU618社区

 找回密码
 立即注册
搜索
查看: 2920|回复: 3

[转贴] 如何快速杀死占用过多资源(CPU,内存)的数据库进程

[复制链接]

该用户从未签到

发表于 2007-3-25 20:57:55 | 显示全部楼层 |阅读模式
很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令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


此时该进程被迅速清除。

签到天数: 2 天

[LV.1]初来乍到

发表于 2007-3-25 21:22:42 | 显示全部楼层

天啊...

这是什么?又Oracle又SQL的?有什么帮助?

签到天数: 1 天

[LV.1]初来乍到

发表于 2007-3-25 21:58:47 | 显示全部楼层
这个...貌似是UNIX或Linux下用的Oracle数据库命令......

还是我提供点XP下用的结束进程的命令吧.

开始->运行->cmd

方法1:
进入命令行,输入ntsd -c q -p PID                    PID为进程号,可以打开任务管理器查看.

方法2:
输入tasklist可以查看进程,之后用taskill结束进程.
格式:taskkill  /im  name
  

该用户从未签到

 楼主| 发表于 2007-3-25 22:03:05 | 显示全部楼层
原来不是同一种事啊:loveliness:
谢谢斑竹大大的解释:D
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2024-11-23 19:10 , Processed in 1.069336 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表