如何快速的杀掉Oracle的Session

一、 问题的提出

很多的时候我们迅速的杀掉 Oralcle 的一些 session, 理由大体如下:

1、 一些时候,由于我们的数据量很大,相应的事务大并且多,在做 shutdown immediate 的时候会花费好多的时间,而我们却想用 shutdown immediate 的方式,而又要把数据库迅速的 shutdown 下来。

2、 我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网络发生的瞬断,从而就产生了一些死进程,他们的状态为 Inactive 的状态。当我们用 alter system kill session ‘sid,serial#’ 进行清除时,这些 session 的状态又变成了 killed ,这些就由 Pmon 进程来慢慢进行清除了,而你恰恰又是个急脾气。

3、 系统忽然慢了现来,你发现是某个 session 在做怪,想迅速把它迅速结束掉。

二、 处理方法

其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个 session 会对应着操作系统中相应的一个进程 (process) ,我们不使用 Alter system kill session 这种方式了,取而代之则是 kill 的方式,当 session 的后台进程被杀掉了,便会促使懒散的 Pmon 进程迅速进行清理工作。

1、 以一个 session 做以示例,

a、 找到你要杀掉的那个 session, 并记下 paddr

b、 找到这个 session 所对应的 spid

c、 杀掉 spid 所标识的那个进程

♀ 如果你的 Oracle 是在 Unix 平台上的,可以用 kill 。

$kill 13824

♀如果你的 Oracle是在windown平台上的,有一些的不同,因为windown是以thead来代替process的,需要用到sid和spid两个值,所用的命令也由kill替换为Orakill,格式为:orakill sid spid

C:>orakill 941 13824

d、 再查一下 v$session,看会话在不在了。

2、 如何谋杀掉所有的 Oracle的用户的进程呢?

a、 windows的环境,执行如下图中的SQL,并把结果存成.bat的文件,比如kill.bat, 执行一下kill.bat就可以了。

b、 Unix的环境相对来说就简单多了,执行如下的命令就可以了

$ ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill

然后你再 shutdown immediate就很快的了。

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus