動かざることバグの如し

近づきたいよ 君の理想に

MySQLでToo many connectionsの原因クエリ特定の対処法

環境

症状

max_connectionsの設定を大きくしているのにもかかわらず、なんらか悪いSQLが走ってしまってテーブルがロックしてしていまい「Too many connections」エラーになる。

対応方法

まずは焦らずロックの原因になってしまっているSQLを(あとからでもいいので)特定できるように保存する

先に詰まってるクエリ一覧をバックアップ

mysql -p  -e 'show full processlist' > sql_list.txt

fullをつけないとSQLが省略されてしまうので注意

次にいったん全クエリをkillしてToo many connectionsを解消する。以下のコマンドを実行

mysql -p  -e 'select concat("KILL ",id,";") from information_schema.processlist;' -s

するとKILL プロセスIDをリストがバーっと出力される。

concat("KILL",id,";")
KILL 202718241;
KILL 202718240;
KILL 202718239;
KILL 202718238;
KILL 202718237;
KILL 202718236;
(略)

これをコピーして対象のMySQLサーバーにログインしてコピペ実行すれば一旦は全クエリが中止される。

そして最初に保存したsql_list.txtを確認して、悪いSQLを特定していく おわり

蛇足

現在のコネクション数 show processlistの行とほぼ一致するはず

show variables like "%max_connections%";

MySQLのコネクション数を増やす設定

mysql> set global max_connections = XXXX;