如何终止正在运行的SELECT语句

53

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

根据SELECT语句,该命令将不断地输出信息,我想在其中停止它。


2
你用什么启动了那个select语句?(sqlplus,一个应用程序,还是其他的?) - Mat
1
你是否正在寻找 CTRL+C? - fancyPants
@AshishAnand:你在哪里输入那个命令?使用什么工具?你真的尝试过结束会话吗? - Mat
也许最好在serverfault上问这个问题? - Lukas Eder
2
请将此内容放入您的问题中。您现在所提供的内容完全不同,甚至没有暗示它是基于Web的上下文。 - Mat
显示剩余4条评论
6个回答

82
作为你不断获取结果页面的前提,我假设你在SQL*Plus中开始了这个会话。如果是这样的话,最简单的方法就是一遍又一遍地按下ctrl + break,直到它停止。
更复杂、更通用的方法如下,按照恶性程度递增的顺序进行详细说明。第一个方法可能适合你,但如果不行,你可以继续往下走。 大多数这些方法都不建议使用,可能会产生意想不到的后果。


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

根据ObiWanKenobi的回答ALTER 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. 操作系统 - 发出SIGKILL信号

kill -9 pid

使用您在第2步中选择的相同的pidSIGKILL是操作系统向特定进程发送的信号,导致该进程立即终止。再次小心输入。 这应该很少需要。如果您正在执行DMLDDL,它将停止任何回滚处理,并且在发生故障时可能使恢复数据库到一致状态变得困难。

所有剩余选项都将杀死所有会话,并导致您的数据库 - 在6和7服务器的情况下也是如此 - 变得不可用。只有在绝对必要时才应使用...

4. Oracle - Shutdown 关闭数据库

shutdown immediate

这种方法比使用 SIGKILL 更礼貌,但显然会影响数据库中的所有进程,而不仅仅是您的特定进程。对数据库保持礼貌总是一个好习惯。
关闭数据库应该只在得到 DBA(如果有)的同意后进行。也要告诉那些使用数据库的人。
它会关闭数据库,终止所有会话,并在所有未提交的事务上执行 rollback 操作。如果您有大量未提交的事务需要回滚,可能需要一段时间。

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

shutdown abort

这与SIGKILL类似,但再次作用于数据库中的所有进程。它是向数据库发送停止一切并立即死亡的信号 - 强制崩溃。它终止所有会话并且不回滚; 由于此原因,它可能意味着数据库需要更长时间才能启动。尽管语言激烈,shutdown abort并非纯恶,并且通常可以安全使用。
与之前一样,先通知相关人员。

6. 操作系统 - 重启服务器

reboot

显然,这不仅会停止数据库,还会停止服务器,因此请谨慎使用,并在DBA、开发人员、客户和用户的同意下使用。

7. 操作系统 - 最后一步

我曾经尝试过重新启动无法解决问题... 一旦你达到了这个阶段,最好希望你正在使用虚拟机。我们最终选择删除它...


7

这是我使用的方法。首先查询会话和用户:

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';

5

不需要结束整个会话。在Oracle 18c中,可以使用ALTER SYSTEM CANCEL来取消进程:

Cancelling a SQL Statement in a Session

You can cancel a SQL statement in a session using the ALTER SYSTEM CANCEL SQL statement.

Instead of terminating a session, you can cancel a high-load SQL statement in a session. When you cancel a DML statement, the statement is rolled back.

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

If @INST_ID is not specified, the instance ID of the current session is used.

If SQL_ID is not specified, the currently running SQL statement in the specified session is terminated.


在 Oracle 18c 之前,Oracle 12c R2 呢? - jumping_monkey

2

0
哦!刚看到问题中的评论,亲爱的,我错过了它。但是为了以防对其他人有用,我在这里留下答案。
我尝试了“Ctrl + C”和“Ctrl + Break”,都不起作用。我使用的是随Oracle Client 10.2.0.1.0提供的SQL Plus。 SQL Plus是大多数人用作与Oracle数据库连接的客户端。我在“文件”菜单下使用“取消”选项,它停止了执行!

File Menu, Oracle SQL*Plus

一旦您点击文件,请等待几分钟,然后选择命令停止并出现菜单,请单击取消。


-1

如果您想停止进程,可以手动从任务管理器结束它;另一方面,如果您想在数据库管理系统中停止运行查询,可以像这里提供的MS SQL Server那样停止 T-SQL STOP or ABORT command in SQL Server。希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接