【轉】Mysql進程管理

來源:互聯網
上載者:User

標籤:

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
    -> ;

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)

 

-----

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

KILL允許自選的CONNECTION或QUERY修改符:

·         KILL CONNECTION與不含修改符的KILL一樣:它會終止與給定的thread_id有關的串連。

·         KILL QUERY會終止串連當前正在執行的語句,但是會保持串連的原狀。

如果您擁有PROCESS許可權,則您可以查看所有線程。如果您擁有SUPER許可權,您可以終止所有線程和語句。否則,您只能查看和終止您自己的線程和語句。

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

注釋:您不能同時使用KILL和Embedded MySQL Server庫,因為內植的伺服器只運行主應用程式的線程。它不能建立任何自身的連接線程。

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

·         在SELECT, ORDER BY和GROUP BY迴圈中,在讀取一組行後檢查標記。如果設定了終止標記,則該語句被放棄。

·         在ALTER TABLE過程中,在每組行從原來的表中被讀取前,檢查終止標記。如果設定了終止標記,則語句被放棄,暫存資料表被刪除。

·         在UPDATE或DELETE運行期間,在每個組讀取之後以及每個已更行或已刪除的行之後,檢查終止標記。如果終止標記被設定,則該語句被放棄。注意,如果您正在使用事務,則變更不會被 復原。

·         GET_LOCK()會放棄和返回NULL。

·         INSERT DELAYED線程會快速地重新整理(插入)它在儲存空間中的所有的行,然後終止。

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

·         如果在寫入調用中,線程正在等待閒置磁碟空間,則寫入被放棄,並伴隨"disk full"錯誤訊息。

·         警告:對MyISAM表終止一個REPAIR TABLE或OPTIMIZE 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

【轉】Mysql進程管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.