Edited at

Ruby On RailsでMySQLのSocketエラーが出た時は素直にlocalhostを127.0.0.1に直すのが一番いいと思う

More than 3 years have passed since last update.

Ruby On RailsでMySQLを使っている時に、

"can't connect to mysql database using /tmp/mysql.socket"

といったエラーが出ることがあります。

これは、MySQL側で使っているsocketと、RubyのMySQLコネクタが使っているsocketが異なっているために発生する現象で、解決策は巷によく載っています。

だいたい書いてあるのは、

1) my.cnfのsocket設定2箇所をいじってMySQL側をRubyに合わせる

2) lib/ruby-mysql***のソースをいじって、Ruby側をMySQLに合わせる

の2つで、直接の原因であるsocket不一致を解消する方法として異存はないですが、

1)は、ほかのアプリ(例えばphpとか)やコマンドに影響でそうでこわい、

2)は、(個人の好みですが)なるべくgemとかで入ってるライブラリを手でさわりたくない

ってことで抵抗があります。

で、上記以外の方法として

3) database.ymlのhostのlocalhostを、127.0.0.1に変更する

というのがあります。

http://q.hatena.ne.jp/1273032729

これは、MySQLへの接続を、localhostでなくて、127.0.0.1として接続する方法ですが、

こうすると、通常エラーは解消されます。

なんでだろー、localhostも127.0.0.1も同じじゃねー?って思いますが、以下が参考になります。

http://qiita.com/TanukiTam/items/f6a08740d0fcda0db7be

MySQLは、localhost指定すると、問答無用でsocket接続を試みて、127.0.0.1だと通常のTCP/IP接続をするようです。

なので、3)は、そもそも元凶のsocket通信自体回避する方法です。

直すのあっという間だし、影響も自分のアプリだけなので、3)がいい気がしますが、ググってたどり着く回答は1)、2)が多くて、3)はちょっと控えめって感じです。

Railsに詳しくないので、hostの部分をlocalhostにしておいたほうがよい理由があるのかなー。

(MySQL、Railsに詳しい人の知見求む)