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,如需转载请自行联系原作者

目录
相关文章
|
7月前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错之使用oracle-cdc的,遇到错误:ORA-01292: no log file has been specified for the current LogMiner session,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
SQL Oracle 关系型数据库
Oracle 技巧篇-快速批量删除当前数据库连接的用户,一键清空所有session会话方法
Oracle 技巧篇-快速批量删除当前数据库连接的用户,一键清空所有session会话方法
779 0
Oracle 技巧篇-快速批量删除当前数据库连接的用户,一键清空所有session会话方法
|
SQL Oracle 关系型数据库
Oracle 数据库利用sql语句杀掉用户session进程,“ORA-01940: 无法删除当前连接的用户“问题解决办法
Oracle 数据库利用sql语句杀掉用户session进程,“ORA-01940: 无法删除当前连接的用户“问题解决办法
372 0
Oracle 数据库利用sql语句杀掉用户session进程,“ORA-01940: 无法删除当前连接的用户“问题解决办法
|
运维 Oracle 关系型数据库
Tomcat集群session复制与Oracle的坑。。
问题描述 公司某个系统使用了tomcat自带的集群session复制功能,然后后报了一个oracle驱动包里面的连接不能被序列化的异常。
182 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会话进程的脚本,来减轻操作的压力。
1554 0
|
SQL 监控 Oracle
Oracle 12c之后CDB上创建公共用户无法访问PDB 上v$session表内容
Oracle 12c CDB模式下,创建公共用户,登录到CDB,无法查看PDB下一些表的信息,如v$session,登录到具体PDB才能看到,这篇文章将介绍如何给公共用户授权解决这个问题。
1774 0
|
SQL Oracle 关系型数据库