当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 如何快速杀死占用过多资源(CPU,内存)的数据库进程

MSSQL
SQL Server口令 sql server安全性
解决SQL Server虚拟内存不足情况
sql中varchar和nvarchar的区别与使用方法
将count(*)值写入另一个表中的方法
SuperSocket 信息: (SpnRegister) : Error 1355。解决方法
sqlserver 复制表 复制数据库存储过程的方法
关于Select Where In 的排序问题
精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
在查询结果中添加一列表示记录的行数的sql语句
一条语句简单解决“每个Y的最新X”的经典sql语句
LINQ to SQL:处理char(1)字段的方式会引起全表扫描问题
SQL2000中改名和删除默认sa帐号的最安全方法
mssql SA帐号的改名和删除
SQLServer中master数据库分析
一道sql面试题附答案
三种实现方法实现数据表中遍历寻找子节点
经典SQL语句大全
实例学习mssql存储过程分析
SQL Server中选出指定范围行的SQL语句代码
[图文]三分钟学会Sql Server的复制功能

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 78 ::
收藏到网摘: n/a

 

很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令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

 


此时该进程被迅速清除。