MySQLでToo many connectionsが出た時にチェックする項目の整理
MySQL側で見る事
どのMySQLサーバーで起きているか分かっている時にはそのサーバーにログインして確認する。
設定値の確認
MySQLにログインしてmax connectionsの確認をする
mysql> show variables like "%max_connections%";
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 1000 |
+-----------------+-------+
1 row in set (0.00 sec)
my.cnfの設定の確認ではなく実際にサーバーにログインして確認する。設定が反映されていない可能性があるので。
現状のコネクション数の確認
processlistの確認。
mysql> show processlist;
(ずらーっと現状の接続プロセスが出る)
ここで出てくるプロセスの数がmax_connectionsと同じだったらToo many connectionsが発生する。
processlistには接続元のHost情報や実行しているクエリの情報が出るのでその情報を元に犯人を特定する。
クライアント(Webサーバー)で見る事
どのMySQLサーバーで起きているか分からない時には、クライアントでまずはサーバーの特定をする。
MySQL(3306ポート)への接続数確認
MySQLに接続しているクライアントサーバー上で以下を実行。
netstat -anp | grep 3306
これで3306に繫いでいる接続の数がMySQLのmax connectionsよりも多ければ、Too many connectionsが発生する。
クライアントが複数の場合には、それぞれの接続数の和がmax connectionsよりも多くなってはいけない。
各アプリケーションの接続数、接続方法確認
アプリケーションでconnections数の設定や、コネクションプーリングしているかどうかの設定が書かれているのでそこを確認する。
対応方法
max connectionsを広げる
max connectionsはオンラインで変更可能なので、mysqlにログインして以下を実行
mysql> set global max_connections = XXXX;
あまり上げすぎるとメモリを食うので、必要な分だけ上げる。
必要な分は前述のクライアントの状況を確認すれば分かる。
RDSの場合にはparameterグループを修正する。修正後自動的に反映される。
クライアント側で調整
mysqlのmax connectionsを広げられない場合には、クライアントの設定でconnection数を減らすようにする。
Railsの場合、connection数が5でもModel毎にestablish_connectionしていると、connection数 x process数になってしまうので注意。