MySQL - 「Can’t connect to MySQL server on ‘localhost’ (10048)」エラー!
Updated:
最近、WindowsXPマシンで「Ruby on Rails」+「MySQL」のアプリを作成していると以下のようなエラーが発生するようになりました。
Can’t connect to MySQL server on 'localhost' (10048)
調べてみると、どうやらWindowsだけの問題らしいです。(Linux等では問題ないようです)
今後のために記録として残しておきます。
原因
WindowsXPやWindows2003ServerなどのWindowsOSでは、一時的な接続のために使用可能な通信ポートとして、1025番から5000番までを使用する設定になっている。 このため、セッション数が増大すると使用可能なポートが不足し、OS側で新しい接続を受け付けられなくなることがある。 ※具体的には、WindowsOSからMySQLサーバに毎秒20回程度以上接続・切断を繰り返すと数千回くらいで接続エラーになる。ということ。
解決策
私が調べた結果、以下の2通りの解決方法があるようです。
解決方法1
MySQLサーバへの接続回数が毎秒20回程度以下になるようにプログラムを書き換える。 ※具体的には、ループしながら何千回とMySQLサーバへアクセスさせるのではなく、なるべくまとめてアクセスするようにする。
解決方法2
Windowsのレジストリ設定を変更する。 ※レジストリ操作は危険が伴います。必ず作業前にバックアップを取り、各自の責任で作業すること。 レジストリを編集することによる如何なる問題に対しても当方は保証をいたしかねます。
※また、当方は前述の「解決方法1」で対応できたため、実際にはこの「解決方法2」は試していません。
レジストリエディタで次の2ヵ所のレジストリを変更します。(値が存在しない場合には追加する)
1.「 MaxUserPort 」 「HKEY_LOCAL_MACHINE」-「SYSTEM」-「CurrentControlSet」-「Services」-「Tcpip」-「Parameters」 とたどっていき、「 MaxUserPort 」の値を変更する。(MAXは「65534」)
※「 MaxUserPort 」は、使用可能な最大ポート番号。(デフォルトは「5000」)
2.「 TcpTimedWaitDelay 」 「HKEY_LOCAL_MACHINE」-「SYSTEM」-「CurrentControlSet」-「Services」-「Tcpip」-「Parameters」 とたどっていき、「 TcpTimedWaitDelay 」の値を変更する。
※「 TcpTimedWaitDelay 」は、「TIME_WAIT」ステータスの継続時間。(デフォルトは「240(秒)」) 最適な値は環境により異なるため、徐々に数値を減らし適切な値に調整する。(推奨は「60(秒)」)
【参考】
1秒当たりの最大要求処理数(connections/sec)
=( 「 MaxUserPort 」 − 1024 )/ 「 TcpTimedWaitDelay 」
以上です。
Comments