我希望能够杀死Oracle 10.2.0.4中的用户查询而不会中止他们的整个会话。这将允许查询结束,但不会将该用户从会话中注销,以便他们可以继续进行其他查询。这可能吗?或者,杀死会话的钝头锤是结束查询执行的唯一方法吗?是否可以在不杀死会话的情况下杀死oracle中的单个查询?
回答
我发现了一个窍门。我不知道这是如何安全的,但它确实有效。有一个Oracle事件10237,被描述为“模拟^ C(用于测试目的)”。
您必须拥有要中断的会话的SID和SERIAL#号。
呼叫SYS.DBMS_SYSTEM.SET_EV(SID,串行#,10237,1, '')以激活目标会话事件。任何当前正在执行的语句应该被中断(接收“ORA-01013:用户请求取消当前操作”)。只要事件被设置,会话尝试执行的任何进一步语句都会立即终止,并出现相同的错误。
要取消激活事件,请将第四个参数设置为“0”进行相同的调用。会话将能够再次执行语句。
请注意,目标会话必须检测事件是否已设置,这可能需要时间或可能永远不会发生,具体取决于它正在做什么。所以你不能快速地打开和关闭事件。您需要将其打开,确认相关语句已停止,然后将其关闭。
下面是一些示例代码。这意味着要在SQLPlus中作为匿名块运行,适当定义替换变量“sid”和“serial”。您可以将它变成一个存储过程,并将其作为参数。
DECLARE
l_status v$session.status%TYPE;
BEGIN
dbms_system.set_ev(&sid, &serial, 10237, 1, '');
LOOP
SELECT status INTO l_status FROM v$session
WHERE sid = &sid and serial# = &serial;
EXIT WHEN l_status='INACTIVE';
END LOOP;
dbms_system.set_ev(&sid, &serial, 10237, 0, '');
END;
你可以看看资源限制:
“,如果用户超过了调用级资源限制,Oracle将暂停语句的处理,回滚语句,并返回一个错误。然而,所有以前的。当前交易的声明保持不变,并且用户的会话保持连接状态。“
这假定取消SQL的原因是资源限制,而不是更新错误的一组行(例如)。我怀疑你无法通过添加资源限制来影响当前正在运行的SQL。
http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/security.htm#i13767
http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dbrm.htm#i1010776
我怀疑这可能是可能的,因为你可以在TOAD中做到这一点。查询运行时,出现“取消”对话框,您可以点击该对话框停止查询。
它是如何实现的我不知道,但会非常感兴趣的发现。
如果您使用的是java,那么java.sql.Statement的cancel()方法应该这样做。看到这里的一些注意事项和限制......
http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/tips.htm#BACDAICJ
蟾蜍通过运行在第二届查询做到这一点;如果操作员取消查询,则TOAD杀死第二个会话。 – 2011-04-19 01:47:37
理想情况下,用户的应用程序应该有能力取消查询(通过OCICancel或等效)。
否则,最好使用资源管理器(如果在Oracle EE上),则可以使用DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_SESS将目标会话设置为使用者组CANCEL_SQL。
另一个黑客取消其他场次查询,这并不用sqlplus Windows客户端会话的工作,虽然,将使用kill -URG(这是一个黑客,而不是日常使用)
紧急信号发送到Oracle进程我已经写为什么它在这里工作:
http://blog.tanelpoder.com/2010/02/17/how-to-cancel-a-query-running-in-another-session/
- 1. 如何在不杀死InputStream的情况下杀死或暂停进程?
- 2. 杀死不会杀死进程
- 3. 编写查询杀死用户会话
- 4. Oracle:杀死会话继续运行
- 5. 杀死用户会话
- 6. 触发杀死会话
- 7. 如何杀死PHP会话?
- 8. 杀死postgresql会话/连接
- 9. 有一段时间(1)线程在没有杀死进程的情况下被杀死的机会?
- 10. 如何杀死Symfony2中的会话?
- 11. 如何杀死cakephp中的会话
- 12. 如何在不杀死R进程的情况下杀死ESS中的闪亮应用程序
- 13. 如何在不断开连接的情况下使用Node.js杀死MySQL查询?
- 14. MySQL查询杀死脚本
- 15. 如何在不回滚的情况下杀死SQL进程
- 16. 如何在不杀死孩子的情况下超时waitpid?
- 17. MySQL会话 - 杀死查询以解锁表
- 18. 如何杀死一个PHP会话?
- 19. 是否可以杀死一个或服务器端的所有会话
- 20. 对象是否会被杀死?
- 21. GTK是否会杀死CSS和HTML?
- 22. 如何杀死用户的会话
- 23. 在python中自动杀死Mysql查询
- 24. 杀死进程杀死其他进程
- 25. 当父进程被“kill -9”杀死时,子进程是否也会被杀死?
- 26. Android:AlarmManager可以在TaskManager中被杀死
- 27. 如何杀死锁定的mysql查询
- 28. 检测会话挂起并杀死它
- 29. MySQL查询得到绞死,不得不杀死
- 30. 我可以杀死这个过程吗?
不错的一个。但是,从该循环中退出的条件可能更稳健 - 例如如果会话的状态变为“KILLED”或“SNIPED”,并且也可能是自动超时。 – 2009-06-05 03:11:26