天天看点

怎样把坏的MySQL查询找到并杀死?怎样把坏的MySQL查询找到并杀死?

有时,关系型相关数据库系统的复杂性会把你搞晕,不过幸运的是,使用mysql工具来管理查询就就可以避免这些复杂性。 在本教程中,我将向你们展示 怎样去查找并杀掉任何非法的mysql查询。

怎样把坏的MySQL查询找到并杀死?怎样把坏的MySQL查询找到并杀死?

为了浏览当前正在运行的查询,登陆到mysql终端,然后运行‘show processlist’命令:

mysql> show processlist;

+--------+--------+-----------------+---------+---------+-------+-------+------------------+-----------+---------------+-----------+

| id | user | host | db | command | time | state | info | rows_sent | rows_examined | rows_read |

| 78233 | root | 127.0.0.1:37527 | mysql | sleep | 16474 | | null | 6 | 6 | 6 |

| 84546 | root | 127.0.0.1:48593 | mysql | sleep | 13237 | | null | 2 | 2 | 2 |

| 107083 | root | 127.0.0.1:56451 | mysql | sleep | 15488 | | null | 1 | 121 | 121 |

| 131455 | root | 127.0.0.1:48550 | null | query | 0 | null | show processlist | 0 | 0 | 0 |

4 rows in set (0.03 sec)

首先你应该查看'time'项,这里记录了进程执行 "做其当做的事情" 操作的秒数。‘command’项处于‘sleep’ 状态的进程表示其正在等待接受查询,因此,它并没有消耗任何资源。对于其他任何进程而言,‘time’超过一定的秒数表明出现问题。

在上面的例子中,唯一运行的查询是我们的‘show processlist’命令。让我们来看看如果我们有一个写的很烂的查询是怎么样的:

+--------+--------+-----------------+-----------+---------+-------+--------------+----------------------------------+-----------+---------------+-----------+

| id | user | host | db | command | time | state | info | rows_sent | rows_examined | rows_read |

| 78233 | root | 127.0.0.1:37527 | example | sleep | 18046 | | null | 6 | 6 | 6 |

| 84546 | root | 127.0.0.1:48593 | example | sleep | 14809 | | null | 2 | 2 | 2 |

| 107083 | root | 127.0.0.1:56451 | example | sleep | 17060 | | null | 1 | 121 | 121 |

| 132033 | root | 127.0.0.1:54642 | example | query | 27 | sending data | select max(subtotal) from orders | 0 | 0 | 0 |

| 133933 | root | 127.0.0.1:48679 | null | query | 0 | null | show processlist | 0 | 0 | 0 |

| 134122 | root | 127.0.0.1:49264 | example | sleep | 0 | | null | 0 | 0 | 0 |

6 rows in set (0.00 sec)

啊哈!现在我们看到有一个查询运行了将近30秒。如果我们不想让它的进程继续运行,可以将它的'id'传递给kill命令:

mysql> kill 132033;

query ok, 0 rows affected (0.00 sec)

mysql>

(注意 由于我们没有改变任何数据,mysql总是报告0行被影响。)

明智的使用kill命令能够清除积压的查询。然而,要记住的是,那不是一种永久的方法 - 如果这些查询来自你的程序,你需要去重写它们,或者将继续看到相同的问题不断出现。

原文发布时间:2014-07-27

本文来自云栖合作伙伴“linux中国”

继续阅读