如何杀死正在运行的SELECT语句

时间:2012-03-03 11:00:54

标签: sql oracle select oracle10g sqlplus

如何通过终止会话来停止正在运行的SELECT语句?

该命令根据SELECT语句不断给我输出,我想在两者之间停止输出。

6 个答案:

答案 0 :(得分:69)

当你不断得到结果页面时,我假设你在SQL * Plus中启动了会话。如果是这样,最简单的方法就是多次击打 ctrl + break 直到停止为止。

我在下面按照增加的凶猛/邪恶的顺序详述的更复杂和更通用的方式。第一个可能适合你,但如果没有,你可以继续向下移动。

大多数这些都不推荐,可能会产生意想不到的后果。


1。 Oracle级别 - 终止数据库中的进程

根据ObiWanKenobi's answerALTER SESSION文档

alter system kill session 'sid,serial#';

要查找sid,会话ID和serial#序列号,请运行以下查询 - 从OracleBase汇总 - 并找到您的会话:

select s.sid, s.serial#, p.spid, s.username, s.schemaname
     , s.program, s.terminal, s.osuser
  from v$session s
  join v$process p
    on s.paddr = p.addr
 where s.type != 'BACKGROUND'

如果您正在运行RAC,那么您需要稍微更改一下以考虑多个实例,inst_id是识别它们的原因:

select s.inst_id, s.sid, s.serial#, p.spid, s.username
     , s.schemaname, s.program, s.terminal, s.osuser
  from Gv$session s
  join Gv$process p
    on s.paddr = p.addr
   and s.inst_id = p.inst_id
 where s.type != 'BACKGROUND'

如果您没有运行RAC,此查询也会有效。

如果您使用的是PL / SQL Developer之类的工具,那么会话窗口也可以帮助您找到它。

对于稍微强一些的“kill”,您可以指定IMMEDIATE关键字,该关键字指示数据库不等待事务完成:

alter system kill session 'sid,serial#' immediate;

2。 操作系统级别 - 发出SIGTERM

kill pid

这假设您正在使用Linux或其他* nix变体。 SIGTERM 是从操作系统到特定进程的终止信号,要求它停止运行。它试图让进程优雅地终止。

出错可能导致您终止必要的操作系统进程,因此在输入时要小心。

您可以通过运行以下查询找到pid进程ID,它还会告诉您有用的信息,例如运行该进程的终端以及运行它的用户名,以便您可以确保选择正确的。

select p.*
  from v$process p
  left outer join v$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

再一次,如果您正在运行RAC,则需要稍微更改为:

select p.*
  from Gv$process p
  left outer join Gv$session s
    on p.addr = s.paddr
 where s.sid = ?
   and s.serial# = ?

where子句更改为where s.status = 'KILLED'将帮助您找到仍在“正在运行”的已杀死进程。

3。 OS - 发出SIGKILL

kill -9 pid

使用您在2中选择的相同pid SIGKILL 是从操作系统到特定进程的信号,该进程导致进程立即终止。打字时再次小心。

这很少是必要的。如果您正在执行DMLDDL,它将停止正在处理的任何回滚,并且可能使得在发生故障时难以将数据库恢复到一致状态。

  

所有剩余的选项将终止所有会话并导致您的数据库 - 并且在6和7服务器的情况下 - 变得不可用。只有在绝对必要的情况下才能使用它们......

4。 Oracle - Shutdown数据库

shutdown immediate

这实际上是一个非 SIGKILL 的politer,但显然它会作用于数据库中的所有进程而不是您的特定进程。对您的数据库保持礼貌是总是

关闭数据库只应在DBA同意的情况下进行,如果有的话。告诉使用数据库的人也很高兴。

它关闭数据库,终止所有会话并对所有未提交的事务执行rollback。如果您有需要回滚的大型未提交事务,则可能需要一段时间。

5。 Oracle - 关闭数据库(不太好的方式)

shutdown abort

这与 SIGKILL 大致相同,但再次对数据库中的所有进程都是如此。这是数据库立即停止一切并死亡的信号 - 一次严重的崩溃。它终止所有会话并且不会回滚;因此,这可能意味着数据库再次需要更长的时间startup。尽管有煽动性语言,shutdown abort并非纯粹的邪恶,通常可以安全使用。

如前所述先告知相关人员。

6。 OS - 重新启动服务器

reboot

显然,这不仅会停止数据库,还会停止服务器,因此除了DBA,开发人员,客户端和用户之外,请谨慎使用并征得系统管理员的同意。

7。 OS - 最后一个阶段

我重启不起作用......一旦你到达这个阶段,你最好希望你使用的是VM。我们最终删除了它......

答案 1 :(得分:4)

这就是我使用的。我这是第一个查询以查找会话和用户:

select s.sid, s.serial#, p.spid, s.username, s.schemaname
     , s.program, s.terminal, s.osuser
  from v$session s
  join v$process p
    on s.paddr = p.addr
 where s.type != 'BACKGROUND';

如果同一用户有多个会话,这将告诉我。然后我经常检查以验证会话是否阻止了数据库。

SELECT SID, SQL_ID, USERNAME, BLOCKING_SESSION, COMMAND, MODULE, STATUS FROM v$session WHERE BLOCKING_SESSION IS NOT NULL;  

然后我运行ALTER语句以这种格式杀死特定会话:

ALTER SYSTEM KILL SESSION 'sid,serial#'; 

例如:

ALTER SYSTEM KILL SESSION '314, 2643';

答案 2 :(得分:3)

无需杀死整个会话。在Oracle 18c中,您可以使用ALTER SYSTEM CANCEL

  

在会话中取消SQL语句

     

您可以使用ALTER SYSTEM CANCEL SQL语句取消会话中的SQL语句。

     

您可以取消会话中的高负载SQL语句,而不是终止会话。取消DML语句时,将回滚该语句。

ALTER SYSTEM CANCEL SQL 'SID, SERIAL[, @INST_ID][, SQL_ID]';
     

如果未指定@INST_ID,则使用当前会话的实例ID。

     

如果未指定SQL_ID,则终止指定会话中当前运行的SQL语句。

答案 3 :(得分:2)

要在Oracle中终止会话,请使用 ALTER SYSTEM KILL SESSION 命令。

详细信息:http://www.oracle-base.com/articles/misc/KillingOracleSessions.php

答案 4 :(得分:0)

哦!只是阅读有问题的评论,亲爱的,我错过了。但只是让答案在这里,以防它对其他人有用

我试过“Ctrl + C”和“Ctrl + Break”都没有用。我使用的是Oracle Client 10.2.0.1.0附带的SQL Plus。 SQL Plus被大多数人用作连接Oracle DB的客户端。我使用了File菜单下的Cancel,选项,它停止了执行!

File Menu, Oracle SQL*Plus

单击文件等待几分钟后,选择命令暂停,出现菜单,单击取消。

答案 5 :(得分:-1)

如果你想停止进程你可以从另一端的任务管理器手动终止它,如果你想在DBMS中停止运行查询,你可以停止这里给出的ms sqlserver T-SQL STOP or ABORT command in SQL Server 希望它能帮到你