Amazon RDS な MySQL で 不要 process を kill する
MySQL で Too 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 processlist
と select * 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)