Last Updated on 2021年7月4日 by かんりにん
割と初歩的なメモ。環境としては、OSはCentOS6.5、MySQLはRPM版5.5(Remi)です。
開発中のPHPのAppサーバーからdbサーバーへアクセスする際、コネクションエラーでアクセスができなくなるエラーが発生。
開発チームから相談を受け、DB側で確認したところ、コネクション数が確かに多い。
mysql> show status like 'Conn%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Connections | 343 | +---------------+-------+ 1 row in set (0.00 sec)
まだテスト段階なので、”max_connections”などDBの設定もデフォルトのままの段階なので
このエラーはやむを得ず・・・
mysql> show variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 151 | +-----------------+-------+ 1 row in set (0.00 sec)
しかしテストを始めたばかりでこのコネクション数は何だろ、と思いつつ
コネクション数の上限超過でアクセス制限がかかるのか、そのような設定があるのかを調べたところ、
mysqlのサイトで以下のような情報が。(4.1なので古いが・・・)
http://dev.mysql.com/doc/refman/4.1/ja/blocked-host.html
“これは、mysqld が ‘hostname’ ホストから多くの接続エラー(max_connect_errors)を受けた場合に発生します。”
“max_connect_errors 大量発生後、mysqld は何か問題(クラッカーからの攻撃など)が発生したと判断し、”
“このホストからの接続を拒否するようにします。これを解除するには、mysqladmin flush-hosts コマンドを実行します。”
“デフォルトでは、接続エラーが 10 回発生すると、mysqld はそのホストを拒否します。”
とのこと。テストの段階で、ここも見落とさずに考慮しとかないと。
ということで回避策を。DB側で実施する。
コネクション数をフラッシュする場合
まずコネクション数をflush
# mysqladmin -h localhost -uroot -p flush-hosts
そのあと、max_connectionsを余裕のある値に拡張するなどして対応
mysql> set global max_connections = <設定値>;
再起動できる状況なら、mysqld起動時に”max_connect_errors”の回数などを指定して起動することも可能。
shell$ mysqld_safe -O max_connect_errors=10000 &
ただ、起動するたびに指定するのはアレなので
恒久的には、”set global”でなくmy.cnfに記述するのが適切。
ただし根本的な解決は、接続エラーが発生する原因とその回数を突き止めて直すこと!
ということで開発アプリの修正のお手伝いをしてきますw