Amazon RDS な MySQL で 不要 process を kill する

MySQLToo many connections が発生しました。 processlist を確認したところ、Command が Sleep なプロセスが多く発生しており、 結果最大接続数の上限に達してしまうことで発生していたのでした。 Sleep なプロセスが接続を持ったまま残っていることは問題なので、これを削除することとします。

まずは processlist を表示します。

show full processlist を実行するか、select * from information_schema.PROCESSLIST を実行します。

COMMAND が 'Sleep' で、TIME が 1000 以上のものを抽出するには下記のようにします。

mysql> select * from information_schema.PROCESSLIST where USER='user' and COMMAND='Sleep' and TIME > 1000;

これらの process を一気に kill するためにコマンドを作ります。

mysql -uroot -hhostname testdb -p -e "select concat('KILL ', id, ';') from information_schema.PROCESSLIST where USER='mery_db_user' and Command='Sleep' and TIME > 1000;" > /tmp/a.txt

mysql 上で source するか、shell上で 流し込みます。

mysql> source /tmp/a.txt

ちなみに、Amazon RDS だと kill で process を kill できません...

mysql> kill 64890;
ERROR 1095 (HY000): You are not owner of thread 64890

そのような場合には mysql.rds_kill を使って kill します。

mysql> CALL mysql.rds_kill(66825542);
Query OK, 0 rows affected (0.00 sec)

付録

show full processlistselect * from information_schema.PROCESSLIST

root@localhost[footest]:4> show full processlist ;
+-----+------+-----------+----------+---------+-------+-------+-----------------------+
| Id  | User | Host      | db       | Command | Time  | State | Info                  |
+-----+------+-----------+----------+---------+-------+-------+-----------------------+
| 774 | root | localhost | foo     | Sleep   |    55 |       | NULL                  |
| 775 | root | localhost | NULL     | Sleep   |    24 |       | NULL                  |
| 918 | root | localhost | foo     | Sleep   | 13242 |       | NULL                  |
| 933 | root | localhost | footest | Sleep   | 21712 |       | NULL                  |
| 965 | root | localhost | foo     | Sleep   | 21472 |       | NULL                  |
| 969 | root | localhost | footest | Query   |     0 | init  | show full processlist |
+-----+------+-----------+----------+---------+-------+-------+-----------------------+
6 rows in set (0.00 sec)

root@localhost[footest]:5> select * from information_schema.PROCESSLIST;
+-----+------+-----------+----------+---------+-------+-----------+----------------------------------------------+
| ID  | USER | HOST      | DB       | COMMAND | TIME  | STATE     | INFO                                         |
+-----+------+-----------+----------+---------+-------+-----------+----------------------------------------------+
| 965 | root | localhost | foo     | Sleep   | 21640 |           | NULL                                         |
| 918 | root | localhost | foo     | Sleep   | 13410 |           | NULL                                         |
| 969 | root | localhost | footest | Query   |     0 | executing | select * from information_schema.PROCESSLIST |
| 774 | root | localhost | foo     | Sleep   |    43 |           | NULL                                         |
| 775 | root | localhost | NULL     | Sleep   |     2 |           | NULL                                         |
| 933 | root | localhost | footest | Sleep   | 21880 |           | NULL                                         |
+-----+------+-----------+----------+---------+-------+-----------+----------------------------------------------+
6 rows in set (0.02 sec)

Ref