【问题标题】:How can I stop a running MySQL query?如何停止正在运行的 MySQL 查询?
【发布时间】:2011-04-16 19:17:08
【问题描述】:

我从我的 Linux shell 连接到 mysql。我时不时地运行一个太大的SELECT 查询。它打印和打印,我已经知道这不是我的意思。我想停止查询。

点击Ctrl+C(几次)完全杀死mysql并将我带回shell,所以我必须重新连接。

是否可以在不杀死mysql 本身的情况下停止查询?

【问题讨论】:

标签: mysql kill processlist


【解决方案1】:
mysql>show processlist;

mysql> kill "number from first col";

【讨论】:

  • 但是mysql 正在打印...我看不到提示
  • 我同意这种基本方法,但我认为在这种情况下使用KILL QUERYKILL 更可取。这样查询就会被终止,但连接不会。
  • 如果您的进程列表滚动到缓冲区之外,一个有用的提示是设置寻呼机。只需在提示符处输入'\P more'。在此处查看有关此提示的更多信息dbasquare.com/2012/03/28/…
  • @Zilverdistel 在 phpMyAdmin 中是如何做到的?
  • 如果在 AWS RDS 上使用 MySQL,您将无权运行 KILL,但您可以运行:CALL mysql.rds_kill(12345)
【解决方案2】:

只是添加

KILL QUERY **Id** 其中Id是来自show processlist的连接ID

如果您通常不想在从某些应用程序运行时终止连接,则更可取。

更多细节可以阅读mysql文档here

【讨论】:

  • 我有一个与此相关的问题,连接是刚刚重新生成,还是终止连接最终会导致池大小太小而无法运行应用程序?
【解决方案3】:

连接到mysql

mysql -uusername -p  -hhostname

显示完整的进程列表:

mysql> show full processlist;
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| Id      | User   | Host              | db      | Command | Time | State | Info             |
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| 9255451 | logreg | dmin001.ops:37651 | logdata | Query   |    0 | NULL  | show processlist |
+---------+--------+-------------------+---------+---------+------+-------+------------------+

杀死特定的查询。这里id=9255451

mysql> kill 9255451;

如果您的权限被拒绝,请尝试以下 SQL:

CALL mysql.rds_kill(9255451)

【讨论】:

  • 注意:如果使用 AWS RDS 实例,则需要最后一次查询。
【解决方案4】:

使用mysqladmin 杀死失控查询:

运行以下命令:

mysqladmin -uusername -ppassword pr

然后记下进程id。

mysqladmin -uusername -ppassword kill pid

失控查询不应再消耗资源。

【讨论】:

    【解决方案5】:

    如果您有 mysqladmin 可用,您可以通过以下方式获取查询列表:

    > mysqladmin -uUSERNAME -pPASSWORD pr
    
    +-----+------+-----------------+--------+---------+------+--------------+------------------+
    | Id  | User | Host            | db     | Command | Time | State        | Info             |
    +-----+------+-----------------+--------+---------+------+--------------+------------------+
    | 137 | beet | localhost:53535 | people | Query   | 292  | Sending data | DELETE FROM      |
    | 145 | root | localhost:55745 |        | Query   | 0    |              | show processlist |
    +-----+------+-----------------+--------+---------+------+--------------+------------------+
    

    然后您可以停止托管长时间运行查询的 mysql 进程:

    > mysqladmin -uUSERNAME -pPASSWORD kill 137
    

    【讨论】:

      【解决方案6】:

      您需要运行以下命令来终止该进程。 找出你想杀死的进程的ID

      > show processlist;
      

      从 id 列中获取值并在命令下方触发

      kill query <processId>;
      

      查询参数指定我们需要杀死查询命令进程。

      kill进程的语法如下

      杀死 [连接 | QUERY] processlist_id

      refer此链接了解更多信息。

      【讨论】:

        【解决方案7】:

        这个问题的作者提到它通常只是在 MySQL 打印出他意识到执行了错误查询的输出。 如前所述,在这种情况下,Ctrl-C 没有帮助。然而,我注意到它 将中止当前查询 - 如果您在之前捕获它,则任何输出都是 打印。例如:

        mysql> select * from jos_users, jos_comprofiler;
        

        MySQL 忙于生成上述两个表的笛卡尔积,并且 您很快就会注意到 MySQL 没有将任何输出打印到屏幕上(该过程 状态是发送数据)所以你输入Ctrl-C

        Ctrl-C -- sending "KILL QUERY 113240" to server ...
        Ctrl-C -- query aborted.
        ERROR 1317 (70100): Query execution was interrupted
        

        Ctrl-C 可以类似地用于停止UPDATE 查询。

        【讨论】:

          猜你喜欢
          • 2011-01-05
          • 2017-10-12
          • 1970-01-01
          • 2015-01-12
          • 2016-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多