li
  当前位置:主页 > 性能优化 > 文章内容
li
怎么杀掉特定的数据库会话
来源: www.ixdba.net  作者: IXDBA.NET官方    时间:2008-05-25   阅读:5  

怎么杀掉特定的数据库会话 

 Alter system kill session 'sid,serial#';
或者
alter system disconnect session 'sid,serial#' immediate;
在win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程)
在Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程

一、问题的提出


很多的时候我们迅速的杀掉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

select sid, username, paddr, status from v$session
where username = '用户名' and
status = 'INACTIVE';

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

select * from v$process where addr = '上面查寻的paddr';
c、 杀掉spid所标识的那个进程

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

$kill spid

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

C:\>orakill sid  spid

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

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

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

select 'orakill '||sid||' '||spid as thread from
sys.v_$process p, sys.v_$session s
where sid > 6 and
p.addr = s.paddr ;


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

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

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


有一些死锁进程,异常退出后用
alter system kill session 'sid, serial#';无法释放会话
可从操作系统直接处理。




  上一篇: v$sysstat中的class分别代表什么   下一篇: 如何有效的删除一个大表(extent数...
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·v$sysstat中的class分别代表什么
·怎么样创建使用虚拟索引
·Oracle什么时候会使用跳跃式索引...
·怎么避免使用特定索引
·怎么样快速复制表或者是插入数据
·如何使用Hint提示
·怎么样快速重整索引
·怎么样分析表或索引
·怎么设置整个数据库系统跟踪
·如何跟踪自己的会话或者是别人的...
·如何有效的删除一个大表(extent数...
·怎么清理oracle临时段
·如何收缩临时数据文件的大小
·怎么样dump oracle数据库内部结构...
·如何获得所有的事件代码
·怎么样快速重整索引
·怎么快速查找锁与锁等待
·怎样监控无用的索引
·怎么样根据OS进程快速获得DB进程...
·怎么样能固定自己的执行计划
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接