怎樣把壞的MySQL查詢找到並殺死?

來源:互聯網
上載者:User

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

《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’命令。讓我們來看看如果我們有一個寫的很爛的查詢是怎麼樣的:

  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中國 榮譽推出

本文永久更新連結地址:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.