Mysql進程管理

mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
|  7 | root | localhost | yy   | Sleep   |  154 |       | NULL             |
|  8 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)

mysql> kill 7
    -> ;html

mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
|  8 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)mysql

 

-----web

每一個與mysqld的鏈接都在一個獨立的線程裏運行,您可使用SHOW PROCESSLIST語句查看哪些線程正在運行,並使用KILL thread_id語句終止一個線程。sql

KILL容許自選的CONNECTIONQUERY修改符:數據庫

·         KILL CONNECTION與不含修改符的KILL同樣:它會終止與給定的thread_id有關的鏈接。服務器

·         KILL QUERY會終止鏈接當前正在執行的語句,可是會保持鏈接的原狀。優化

若是您擁有PROCESS權限,則您能夠查看全部線程。若是您擁有SUPER權限,您能夠終止全部線程和語句。不然,您只能查看和終止您本身的線程和語句。spa

您也可使用mysqladmin processlistmysqladmin kill命令來檢查和終止線程。.net

註釋:您不能同時使用KILLEmbedded MySQL Server庫,由於內植的服務器只運行主機應用程序的線程。它不能建立任何自身的鏈接線程。線程

當您進行一個KILL時,對線程設置一個特有的終止標記。在多數狀況下,線程終止可能要花一些時間,這是由於終止標記只會在在特定的間隔被檢查:

·         SELECT, ORDER BYGROUP BY循環中,在讀取一組行後檢查標記。若是設置了終止標記,則該語句被放棄。

·         ALTER TABLE過程當中,在每組行從原來的表中被讀取前,檢查終止標記。若是設置了終止標記,則語句被放棄,臨時表被刪除。

·         UPDATEDELETE運行期間,在每一個組讀取以後以及每一個已更行或已刪除的行以後,檢查終止標記。若是終止標記被設置,則該語句被放棄。注意,若是您正在使用事務,則變動不會被 回滾。

·         GET_LOCK()會放棄和返回NULL

·         INSERT DELAYED線程會快速地刷新(插入)它在存儲器中的全部的行,而後終止。

·         若是線程在表鎖定管理程序中(狀態:鎖定),則表鎖定被快速地放棄。

·         若是在寫入調用中,線程正在等待空閒的磁盤空間,則寫入被放棄,並伴隨"disk full"錯誤消息。

·         警告:對MyISAM表終止一個REPAIR TABLEOPTIMIZE TABLE操做會致使出現一個被損壞的沒有用的表。對這樣的表的任何讀取或寫入都會失敗,直到您再次優化或修復它(不中斷)。

轉自 http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#load-index

 

mysql 有選擇地kill process


show processlist / show full processlist 能夠看到當前的process信息,
若是想要kill某些process,只能複製它的Id(thread id),而後kill, 每次只能kill一個。
若是要kill掉全部運行時間超過10秒的語句,這樣搞起來就太麻煩了。
今天介紹個簡單的辦法,主要是經過INFORMATION_SCHEMA數據庫來實現。
其中的PROCESSLIST表記錄了process的信息。


找出運行時間超過10秒的process的ID。
SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE COMMAND = 'Query' AND TIME > 10;
這樣彷佛太莽撞了,有些進程不該該被kill的,好比負責replication的。。。
須要過濾一下:


SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE COMMAND = 'Query' AND TIME > 10 
AND ID != CONNECTION_ID() 
AND USER != 'root' 
AND COMMAND != 'Binlog Dump' 
AND STATE NOT REGEXP '(slave|relay|event)'
你也能夠根據實際狀況加入本身的過濾條件。


而後比較悲劇的是 kill 只能接受一個id作爲參數。
只好生成全部的kill語句了:


mysql> SELECT CONCAT('KILL ',ID,';')
FROM   INFORMATION_SCHEMA.PROCESSLIST
WHERE  USER = 'webs'
       AND COMMAND = 'Query'
       AND TIME > 10
  INTO   OUTFILE '/tmp/kill_list.txt';
而後再導入:


注意下面這行語句不是以分號結尾的
mysql> \. /tmp/kill_list.txt
Query OK, 0 ROWS affected (0.00 sec)
雖然如今智能多了,可是這樣搞一回也仍是比較麻煩的。
能夠試試看 Percona Toolkit裏面的 pt-kill, 祝大家好運

轉自http://blog.csdn.net/hewy0526/article/details/8240710

相關文章
相關標籤/搜索