「Can’t connect to local MySQL server through socket」について

2014-04-14T00:00:00+00:00 MySQL

※内部的な所としては微妙なのでネタとして

,よくMySQLに接続してなんかするパターン(RailsのようなActiveRecordとかも含む)において、「Can't connect to local MySQL server through socket」っていうのが出るケースに関して

これ"localhost"って指定するとソケットを見に行くのではと。例えばmy.cnfが


[mysqld]
socket=/tmp/mysqld.sock

[client]
socket=/var/run/mysql/mysql.sock

みたいになってる場合にクライアントライブラリにおいてlocalhostで接続するとTCP/IP接続されずに、ソケットを利用した接続になる。それが原因となり上記のようなソケットエラーになる

で昔良くあるパターンの注意としてPHPのmysql_connectのドキュメント(http://php.net/manual/ja/function.mysql-connect.php)には

サーバー名に "localhost" や "localhost:port" を指定した場合、MySQL クライアントライブラリはそれをオーバーライドし、 ローカルソケット(Windows では名前つきパイプ)に接続しようとします。 TCP/IP を用いたい場合は、"localhost" のかわりに "127.0.0.1" を用いてください。

っていうのがある。でMySQL側的にこれどういう所なのかっていうのを昨日ちょっと調べてみると、MySQLのソース中のsql-common/client.c辺りにLOCALHOSTだなんだらかんだらしている所がある。とまぁ理論的じゃないのでなんとも言いがたいが、MySQLに接続する場合にはlocalhostは無駄に指定するのは止めといた方が良い。別にソケット接続しても良いようなケースなら良いとは思うんだけど、無駄に設定を書き換えるようなケースになるようなくらいなら使わない方が良いのではと

っていうかこれ常識的じゃないのかなって思うんですが

要点だけまとめると

  • localhostを指定するとclient設定されているソケットを見るようになる
  • 127.0.0.1を指定するとソケットをLLAであってもTCP/IP接続をする
  • 特に理由が無いのであれば127.0.0.1を使うべき

っていう事なんじゃないでしょうかねって事で終わり

追記

my.iniにprotocol=tcpって追加してもいいっぽい

angular.jsをやってみる (23) - ngTouchを使ってスワイプイベントを利用 - angular.jsをやってみる (22) - $exceptionHandler -