2013年1月17日木曜日

プロセスをまとめてぬっころす!

たま~に、更新系の重いSQLを実行してしまい、
Waiting for table metadata lockが大量に発生してしまった場合に、
プロセスをこっそりkillしたり・・・orz

大人の事情でその重いSQLを殺せず、Waiting for table metadata lockが発生している方を殺したり・・・((((;゚Д゚))))ガクガクブルブル

そういうときに大量のプロセスを殺す際に、今まではSHOW PROCESSLIST;を打って、
そこに表示されるプロセスIDを一つ一つコピペをしてやっていました。

ただ、その際にSHOW PROCESSLIST;が表示してくれる表は次のように表示されるので、
mysql> show processlist;
+---------+----------+---------------------+----------+---------+------+----------------------+------------------------------------------------------------------------------------------------------+
| Id      | User     | Host                | db       | Command | Time | State                | Info                                                                                                 |
+---------+----------+---------------------+----------+---------+------+----------------------+------------------------------------------------------------------------------------------------------+
| 1854563 | ******** | ***.***.***.*:47674 | ******** | Query   |    0 | NULL                 | show processlist                                                                                     |
| 1854753 | ******** | ***.***.***.*:40079 | ******** | Execute |   90 | NULL                 | SELECT count(id) AS `count`, `searchtmpdata`.`*`, `searchtmpdata`.`ta |
+---------+----------+---------------------+----------+---------+------+----------------------+------------------------------------------------------------------------------------------------------+
そのIdの列の部分を一つ一つコピペしてkillみたいな感じで大変面倒でしたが、
次のコマンドを使うことで多少楽になりましたド━━━━m9(゚∀゚)━━━━ン!!

SHOW PROCESSLIST;と次のSQLの結果は殆ど?同じだそうです。
#
SELECT * FROM information_schema.PROCESSLIST;
これを利用して、
#
SELECT group_concat(id) FROM information_schema.PROCESSLIST WHERE User='SQLを実行しているユーザー名';
とやると、そのユーザーが実行しているSQLのプロセスIDが取得でき、
group_concatでその取得できた1対Nのid一覧をカンマ区切りに連結してくれる!!(゚∀゚)キタコレ!!
mysql> SELECT group_concat(id) FROM information_schema.PROCESSLIST WHERE User='pure_job_com_ex';
+-------------------+
| group_concat(id)  |
+-------------------+
| 57756868,57756866 |
+-------------------+
1 row in set (0.00 sec)
あとは、このIDをコピペして、
$ mysqladmin -u root kill 57756868,57756866
ъ(゚Д゚)グッジョブ!!
※mysqlにログインしている時に利用するkillだと複数プロセスの指定が出来ない?

参考URL

0 件のコメント:

コメントを投稿