如何为用户终止所有活动和非活动oracle会话

如何为用户终止所有活动和非活动oracle会话,oracle,session,stored-procedures,schema,Oracle,Session,Stored Procedures,Schema,我正在尝试下面的脚本一次杀死用户的所有活动和非活动oracle会话,但它不起作用。脚本成功执行,但不会终止用户的会话 BEGIN FOR r IN (select sid,serial# from v$session where username = 'USER') LOOP EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid || ',' || r.serial# || ''''; END LOO

我正在尝试下面的脚本一次杀死用户的所有活动和非活动oracle会话,但它不起作用。脚本成功执行,但不会终止用户的会话

BEGIN
  FOR r IN (select sid,serial# from v$session where username = 'USER')
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid 
      || ',' || r.serial# || '''';
  END LOOP;
END;
KILL SESSION命令实际上并不终止会话。它只要求会话自杀。在某些情况下,如等待远程数据库的答复或回滚事务,会话不会立即终止,而是等待当前操作完成。在这些情况下,会话的状态将为标记为kill。它将尽快被杀死

检查状态以确认:

SELECT sid, serial#, status, username FROM v$session;
您也可以使用IMMEDIATE子句:

IMMEDIATE子句不影响命令执行的工作,但它会立即将控制权返回到当前会话,而不是等待kill的确认。看一看

更新如果你想杀死所有的会话,你可以准备一个小脚本

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' FROM v$session;
将上述内容假脱机到.sql文件并执行它,或者复制粘贴输出并运行它。

执行此脚本:

SELECT 'ALTER SYSTEM KILL SESSION '''||sid||','||serial#||''' IMMEDIATE;' 
FROM v$session 
where username='YOUR_USER';
它将打印出应该执行的sqls

BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' 
        || r.serial# || ''' immediate';
  END LOOP;
END;
这应该行得通-我刚刚更改了脚本以添加immediate关键字。正如前面的回答所指出的,kill会话只标记用于kill的会话;它不会立即这样做,而是在方便的时候再这样做


从你的问题来看,你似乎期望立即看到结果。因此,立即关键字用于强制执行此操作。

对于Oracle 11g,这可能不起作用,因为您可能会收到如下错误

Error report:
SQL Error: ORA-00026: missing or invalid session ID
00026. 00000 -  "missing or invalid session ID"
*Cause:    Missing or invalid session ID string for ALTER SYSTEM KILL SESSION.
*Action:   Retry with a valid session ID.
要纠正此问题,请使用以下代码识别会话

SQL>从gv$会话或v$会话中选择inst_id、sid、串行

注意:v$会话没有inst_id字段

然后用枪杀了他们

alter system kill session 'sid,serial,@inst_id' IMMEDIATE;
它对我有用


终止前一天的非活动会话

开始 对于i,从v$session中选择*from,其中status='INACTIVE'和sysdate-PREV_EXEC_START>1 环 执行IMMEDIATEq{ALTER SYSTEM KILL SESSION'}| i.sid | q'[,]'| i.serial | | q'[']'| | IMMEDIATE'; 端环;
终止这些会议的情况如何?杀死会话并不意味着它会立即消失。如果会话打开了某个事务,那么它首先回滚该事务需要很长时间,然后将退出。因此,我的建议是检查V$session中的列状态。我检查了列状态及其显示的活动会话数。所以它还没有被杀死..您好lalit您所说的是真的,我知道上面的sql命令立即检查并杀死会话。但这不是我问题的答案。假设我有20个会话处于活动状态和非活动状态。那么我不能简单地写20条alter语句来杀死他们。我想立即杀死他们。是的,但是我们不能创建循环或过程来立即杀死这些会话吗?我不知道将来我的用户可能会有20多个会话。@Rahul永远不要使用PL/SQL,因为你可以用纯SQL来完成。而且,这不是你经常做的事情。如果你真的想经常这样做,那么当我添加一个更新时,只需创建一个小脚本,如我上面所示。你好,lalit只是一个小问题,我不需要在你的查询中指定要终止会话的用户吗?要终止所有会话:选择“ALTER SYSTEM kill session”| | sid | | |',“| serial | | |”从v$session开始;然后复制结果并执行。作者忘了写一些“CharactersHanks@TobySpeight,我是新来的。更新了我的答案,并解释了原因。谢谢-你做了哪些不同并不明显。
alter system kill session 'sid,serial,@inst_id' IMMEDIATE;
BEGIN
  FOR r IN (select sid,serial# from v$session where username='user')
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || r.sid  || ',' || r.serial# || '''';
  END LOOP;
END;
/