Solaris下批量kill掉oracle的session

简介:

      在要drop一个数据库用户时发现这个用户已连接到数据库,因此没法直接drop掉这个用户。使用

 
 
  1: select * from v$session where username='USERNAME' and STATUS <>'KILLED'

查看出要kill掉的session后,发现有近15个session。发现这样一个个去kill,太慢了,就来了招狠的:

 
  1: SELECT CONCAT('ALTER SYSTEM KILL SESSION ''',CONCAT(CONCAT(CONCAT(SID,','),SERIAL#),''';')) FROM V$SESSION WHERE USERNAME='SCOTT'

最后生成了一堆类似:

 
 
  1: ALTER SYSTEM KILL SESSION 'SID,SERIAL';

这样的语句。

      将这一堆语句贴到dbvis中,执行了下,确实是把所有与USERNMAE相关的sessionkill掉了,但是下次用USERNAME用户登录后,发现session个数并没有掉下去。

      从网上查资料来看,“当一个session被kill掉以后,该session的paddr被修改,如果有多个 session被kill,那么多个session的paddr都被更改为相同的进程地址”,在这种情况下,先前被占用的资源是无法被释放的,因此要从操作系统级去释放这些资源。实际上,在数据库层,每生成一个session,在Solaris上会新增一个oracle用户的进程,windows上由于有线程机制,会在oracle.exe中生成对应的线程。

      因此,在Solaris下,确定好了要清除的session对应的操作系统级别的进程,然后在把这些进程kill掉,下次进入系统,就可以看到先前被占用的session在V$SESSION中找不到了。

      那么,怎么去判断要被清除掉的session对应的操作系统进程呢?网上有位前辈说“当在Oracle中kill session以后, Oracle只是简单的把相关session的paddr 指向同一个虚拟地址.此时v$process和v$session失去关联,进程就此中断.然后Oracle就等待PMON去清除这些Session.所以通常等待一个被标记为Killed的 Session退出需要花费很长的时间.”

根据那位牛人的文章,我自己写了个sql:

 
  1: SELECT CONCAT('kill -9 ',SPID) FROM V$PROCESS WHERE V$PROCESS.ADDR IN(
  2: 
  3: select p.addr from v$process p where pid <> 1
  4: 
  5: minus
  6: 
  7: select s.paddr from v$session s)

      在dbvis中执行,执行的结果是生成一堆(又是一堆,-_-!)kill –9  pid这样的语句,将执行结果贴到securecrt中(此时securecrt以oracle用户连接到了对应的Solaris机器上),执行完成后,再用先前的USERNAME这个用户登录数据库,TOUCH一下,退出后,就可以用dba用户drop掉USERNAME用户了。

补充:最后上网找了半天,终于把那位牛人前辈的文章位置找到了:http://www.eygle.com/archives/2004/06/kill_session.html



本文转自leipei博客园博客,原文链接:http://www.cnblogs.com/leipei2352/archive/2011/04/08/2009162.html,如需转载请自行联系原作者

目录
相关文章
|
SQL Oracle 关系型数据库
Oracle 锁表查询及解锁kill进程
1. 查看被锁定的表 SELECT OBJECT_NAME, MACHINE, S.SID, S.
2734 0
|
Oracle 关系型数据库 数据库
Oracle 查看当前会话 SESSION ID 方法
查看当前会话的session  ID 有如下三种方法:   1.   v$mystat视图   SQL> desc v$mystat  Name                ...
1447 0
|
SQL Oracle 关系型数据库
Oracle 技巧篇-快速批量删除当前数据库连接的用户,一键清空所有session会话方法
Oracle 技巧篇-快速批量删除当前数据库连接的用户,一键清空所有session会话方法
698 0
Oracle 技巧篇-快速批量删除当前数据库连接的用户,一键清空所有session会话方法
|
SQL Oracle 关系型数据库
Oracle 数据库利用sql语句杀掉用户session进程,“ORA-01940: 无法删除当前连接的用户“问题解决办法
Oracle 数据库利用sql语句杀掉用户session进程,“ORA-01940: 无法删除当前连接的用户“问题解决办法
317 0
Oracle 数据库利用sql语句杀掉用户session进程,“ORA-01940: 无法删除当前连接的用户“问题解决办法
|
运维 Oracle 关系型数据库
Tomcat集群session复制与Oracle的坑。。
问题描述 公司某个系统使用了tomcat自带的集群session复制功能,然后后报了一个oracle驱动包里面的连接不能被序列化的异常。
153 0
|
SQL Oracle 关系型数据库
Oracle 通过 SID 查询 SESSION 和 SQL 信息
📢 注意:查询条件,需要输入 SPID !
|
SQL Oracle 关系型数据库
Oracle 杀掉 session 相关 sql 语句
所有含有关键字“LOCAL=NO”的进程是Oracle数据库中远程连接进程的共同特点,因此通过以下命令可以kill掉所有的进程
|
SQL Oracle 关系型数据库
实现批量Kill Oracle会话进程
有时业务DML高并发操作会导致表出现很多锁的情况,甚至需要登录服务器kill进程才能完全解锁,此时就需要能够批量Kill Oracle会话进程的脚本,来减轻操作的压力。
1327 0
|
SQL 监控 Oracle
Oracle 12c之后CDB上创建公共用户无法访问PDB 上v$session表内容
Oracle 12c CDB模式下,创建公共用户,登录到CDB,无法查看PDB下一些表的信息,如v$session,登录到具体PDB才能看到,这篇文章将介绍如何给公共用户授权解决这个问题。
1593 0

推荐镜像

更多