怎樣把壞的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 inset(0.03 sec)
首先你應該查看'Time'項,這裡記錄了進程執行 "做其當做的事情" 操作的秒數。‘command’項處於‘Sleep’ 狀態的進程表示其正在等待接受查詢,因此,它並沒有消耗任何資源。對於其他任何進程而言,‘Time’超過一定的秒數表明出現問題。
--------------------------------------分割線 --------------------------------------
Ubuntu 14.04下安裝MySQL
《MySQL權威指南(原書第2版)》清晰中文掃描版 PDF
Ubuntu 14.04 LTS 安裝 LNMP Nginx\PHP5 (PHP-FPM)\MySQL
Ubuntu 14.04下搭建MySQL主從伺服器
Ubuntu 12.04 LTS 構建高可用分布式 MySQL 叢集
Ubuntu 12.04下原始碼安裝MySQL5.6以及Python-MySQLdb
MySQL-5.5.38通用二進位安裝
--------------------------------------分割線 --------------------------------------
在上面的例子中,唯一啟動並執行查詢是我們的‘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| 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 inset(0.00 sec)
啊哈!現在我們看到有一個查詢運行了將近30秒。如果我們不想讓它的進程繼續運行,可以將它的'Id'傳遞給kill命令:
- mysql> kill 132033;
- Query OK,0 rows affected (0.00 sec)
- 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中國 榮譽推出
本文永久更新連結地址: