【问题标题】:How to kill a running SELECT statement如何杀死正在运行的 SELECT 语句
【发布时间】:2012-03-21 16:19:24
【问题描述】:

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

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

【问题讨论】:

  • 你是用什么来开始这个选择的? (sqlplus,一个应用程序,?)
  • 只需键入带有大型数据库的 sql 命令,以便它不断给出输出,我想在两者之间停止它.....
  • 几个月前我问过类似的问题。答案是——没有办法(INTENSE hack 除外)。
  • 可能 CTRL+C 是你要找的吗?
  • 请在您的问题中提出。你现在所拥有的完全不同,甚至没有暗示基于网络的上下文。

标签: sql oracle select oracle10g sqlplus


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    详情请看:http://www.oracle-base.com/articles/misc/KillingOracleSessions.php

    【讨论】:

      【解决方案3】:

      当您不断获得结果页面时,我假设您在 SQL*Plus 中开始了会话。如果是这样,最简单的做法是 bash 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。 操作系统 - 发出SIGKILL

      kill -9 pid
      

      使用您在 2 中选择的 pidSIGKILL 是操作系统向特定进程发出的信号,该信号会导致进程立即终止。再次输入时要小心。

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

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

      4。 Oracle - Shutdown 数据库

      shutdown immediate
      

      这实际上比 SIGKILL 更礼貌,但显然它作用于数据库中的所有进程而不是您的特定进程。对您的数据库有礼貌总是好。

      只有在您的 DBA 同意的情况下,才能关闭数据库(如果您有的话)。也很高兴告诉使用数据库的人。

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

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

      shutdown abort
      

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

      和以前一样,首先通知相关人员。

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

      reboot
      

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

      7。 操作系统 - 最后阶段

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

      【讨论】:

      • @AshishAnand,对不起,我混淆了 RAC 和非 RAC 的用法,我已经澄清并更正了查询(并更改了其他一些让我烦恼的事情)。
      【解决方案4】:

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

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

      单击“文件”后等待几分钟,然后选择命令停止并出现菜单,单击“取消”。

      【讨论】:

        【解决方案5】:

        这是我使用的。我首先执行此查询以查找会话和用户:

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

        【讨论】:

          【解决方案6】:

          没有必要杀死整个会话。在 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 语句。

          【讨论】:

          • Oracle 18c 之前的 Oracle 12c R2 怎么样?
          猜你喜欢
          • 2018-12-10
          • 2019-12-14
          • 2019-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-02
          • 2018-09-12
          相关资源
          最近更新 更多