環境
- MySQL 5.6以降
症状
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;