天天看點

怎樣把壞的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中國”

繼續閱讀