Welcome 微信登录

首页 / 数据库 / MySQL / 怎样把坏的MySQL查询找到并杀死?

有时,关系型相关数据库系统的复杂性会把你搞晕,不过幸运的是,使用MySQL工具来管理查询就就可以避免这些复杂性。 在本教程中,我将向你们展示 怎样去查找并杀掉任何非法的MySQL查询。为了浏览当前正在运行的查询,登陆到MySQL终端,然后运行‘show processlist’命令:
  1. mysql> show processlist;
  2. +--------+--------+-----------------+---------+---------+-------+-------+------------------+-----------+---------------+-----------+
  3. |Id|User|Host| db|Command|Time|State|Info|Rows_sent|Rows_examined|Rows_read|
  4. +--------+--------+-----------------+---------+---------+-------+-------+------------------+-----------+---------------+-----------+
  5. |78233| root |127.0.0.1:37527| mysql |Sleep|16474|| NULL |6|6|6|
  6. |84546| root |127.0.0.1:48593| mysql |Sleep|13237|| NULL |2|2|2|
  7. |107083| root |127.0.0.1:56451| mysql |Sleep|15488|| NULL |1|121|121|
  8. |131455| root |127.0.0.1:48550| NULL|Query|0| NULL| show processlist |0|0|0|
  9. +--------+--------+-----------------+---------+---------+-------+-------+------------------+-----------+---------------+-----------+
  10. 4 rows inset(0.03 sec)
首先你应该查看"Time"项,这里记录了进程执行 "做其当做的事情" 操作的秒数。‘command’项处于‘Sleep’ 状态的进程表示其正在等待接受查询,因此,它并没有消耗任何资源。对于其他任何进程而言,‘Time’超过一定的秒数表明出现问题。--------------------------------------分割线 --------------------------------------Ubuntu 14.04下安装MySQL http://www.linuxidc.com/Linux/2014-05/102366.htm《MySQL权威指南(原书第2版)》清晰中文扫描版 PDF http://www.linuxidc.com/Linux/2014-03/98821.htmUbuntu 14.04 LTS 安装 LNMP NginxPHP5 (PHP-FPM)MySQL http://www.linuxidc.com/Linux/2014-05/102351.htmUbuntu 14.04下搭建MySQL主从服务器 http://www.linuxidc.com/Linux/2014-05/101599.htmUbuntu 12.04 LTS 构建高可用分布式 MySQL 集群 http://www.linuxidc.com/Linux/2013-11/93019.htmUbuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb http://www.linuxidc.com/Linux/2013-08/89270.htmMySQL-5.5.38通用二进制安装 http://www.linuxidc.com/Linux/2014-07/104509.htm--------------------------------------分割线 --------------------------------------在上面的例子中,唯一运行的查询是我们的‘show processlist’命令。让我们来看看如果我们有一个写的很烂的查询是怎么样的:
  1. mysql> show processlist;
  2. +--------+--------+-----------------+-----------+---------+-------+--------------+----------------------------------+-----------+---------------+-----------+
  3. |Id|User|Host| db|Command|Time|State|Info|Rows_sent|Rows_examined|Rows_read|
  4. +--------+--------+-----------------+-----------+---------+-------+--------------+----------------------------------+-----------+---------------+-----------+
  5. |78233| root |127.0.0.1:37527| example |Sleep|18046|| NULL |6|6|6|
  6. |84546| root |127.0.0.1:48593| example |Sleep|14809|| NULL |2|2|2|
  7. |107083| root |127.0.0.1:56451| example |Sleep|17060|| NULL |1|121|121|
  8. |132033| root |127.0.0.1:54642| example |Query|27|Sending data |select max(subtotal)from orders |0|0|0|
  9. |133933| root |127.0.0.1:48679| NULL|Query|0| NULL | show processlist |0|0|0|
  10. |134122| root |127.0.0.1:49264| example |Sleep|0|| NULL |0|0|0|
  11. +--------+--------+-----------------+-----------+---------+-------+--------------+----------------------------------+-----------+---------------+-----------+
  12. 6 rows inset(0.00 sec)
啊哈!现在我们看到有一个查询运行了将近30秒。如果我们不想让它的进程继续运行,可以将它的"Id"传递给kill命令:
  1. mysql> kill 132033;
  2. Query OK,0 rows affected (0.00 sec)
  3. mysql>
(注意 由于我们没有改变任何数据,MySQL总是报告0行被影响。)明智的使用kill命令能够清除积压的查询。然而,要记住的是,那不是一种永久的方法 - 如果这些查询来自你的程序,你需要去重写它们,或者将继续看到相同的问题不断出现。

另请参阅

关于不同‘命令’的MySQL文档:
  • https://dev.mysql.com/doc/refman/5.7/en/thread-commands.html

via: http://xmodulo.com/2014/07/find-kill-misbehaving-mysql-queries.html译者:hunanchenxingyu 校对:wxy本文由 LCTT 原创翻译,Linux中国 荣誉推出本文永久更新链接地址