環境
- 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;