什么是在Oracle中杀死指定用户的所有会话的最快方法?

什么是在Oracle中杀死指定用户的所有会话的最快方法?

你应该可以在PL/SQL循环中完成。 请务必在实际调用kill session之前logging参数进行testing。

 BEGIN FOR c IN ( SELECT s.sid, s.serial# FROM v$session s WHERE s.username = 'your_user_name' ) LOOP EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' || c.serial# || ''''; END LOOP; END; 

在asktom上看到类似的问题 。

另一种可以运行得更快的方法是生成orakill命令并在DOS窗口中执行它们:

 SELECT 'orakill '||d.name||' '||spid FROM v$session s JOIN v$process p ON addr=paddr JOIN v$database d ON (1=1) WHERE s.username = 'THE_USER'; 

Orakill不会等待会议交易完成,所以杀人非常快。

无论你的解决scheme是什么,小心!

有一点需要注意的是,在Oracle中杀死会话并不一定会阻止用户的会话(和相关进程)消耗资源。 所以一个失控的查询可能会继续失控,消耗像CPU和I / O这样的资源,并持有锁,直到用Oracle进程监视器(pmon)进程/线程检查。

假设在“专用连接”模式下在Unix系统上运行Oracle,可以在v $ session.paddr = v $ process.addr上joinv $ session和v $进程来查找给定用户连接的所有会话和进程,并使用带SIGKILL的UNIX kill comm命令来SIGKILL用户会话的底层服务器进程。 然后,pmon将清理失败的会话,回滚任何事务并释放任何锁。

当Peter Lang先前指出的方法不足以激烈地扼杀用户的会话时,这绝对是一个大锤子的方法。

改变系统检查点;
关机中止
启动限制
立即closures

🙂

Peter Lang的回答是一个非常轻松的改进,我觉得使用起来更方便。 它是互动的,并要求input用户名:

 PROMPT Entrer the username to kill; DEFINE username = &1 BEGIN FOR c IN ( SELECT s.sid, s.serial# FROM v$session s WHERE s.username = '&&username' ) LOOP EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' || c.serial# || ''''; END LOOP; END; /