Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’のエラーを解消するためのヒント

エラーアイキャッチ MySQL

どうも、フリーランスエンジニア目指して奮闘中のYuta(@yuta_ushijima)です。

今回チャットアプリ開発に置ける環境設定を行うにあたり、この記事を投稿した当時、ずっとmysqlのエラーにハマっていました。

僕のRails師匠であるchinjuさんに助けを求めたところ、無事にエラーが解消できたのでその手順を残しておきます。

結論から言うと、mysqlの設定ファイルを全て削除して、再度インストールしただけなので、原因は未だにわかってません

それでも、現在は順調に環境構築できているので、同じくエラーにハマった方は参考にしていてください。

開発環境

rails 5.1.2
ruby 2.4.1

今回の記事の対象者

  • ソケットエラーで煮詰まっている人
  • RailsをProgateなどで学び始めた人

何度ググっても解消されない【Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’】

もーいやー!

当時何度このエラーをみた事でしょうか。。

開発に着手してからこの2日間ずっと

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock

のエラー文がターミナルを埋め尽くしていました。

Qiitaやグーグル先生に聞いて、同じ解消法を試して見ても、

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

もしくは

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (38)

になるだけ。

この文をみるたびに思わず、

Yuta
Yuta

自分にはRails向いていないのかな。。。

と弱気になりかけました。

原因はエラー文に書いてある!単純にsocketが通っていない。 2018/05/09-追記-

ここで、エラー文をもう一度確認してみましょう。

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

日本語に訳すと、PCは次のように言ってくれています。

パソコンくん
パソコンくん

‘/tmp/mysql.sock’というソケットを使ったけど、MySQLに接続できなかったよー。

この問題を解決するカギとなるのが、ソケットというパワーワード。こいつの意味をしっかりと理解していないと、根本的な解決にはなりません。

そもそも、ソケットとはなんでしょう?

すごくざっくりとした言い方をすれば、ネットワーク(MySQL)とプログラム(Rails/Ruby)を繋いでくれる窓口

今回の場合、次のように言い換えると、もっとわかりやすいかもしれません。

パソコンくん
パソコンくん

‘/tmp/mysql.sock’という窓口でMySQLとRailsを繋ごうとしたけど、ダメだったよー。

ということは、このエラーを解決するためには、MySQLとRailsがちゃんと繋がることができる窓口を用意すればいいってことですね。

ソケットは、OSによってそのパスが異なります。まずはターミナルで以下のコマンドを叩いてみましょう。

$ mysql_config --socket

すると、以下のパスが返ってきます。

/tmp/mysql.sock

次に、Railsの場合はDBの接続情報を管理しているconfig/database.ymlを開いてください

# コメント行は省略してあります

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: 
  password: 
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: like-slack_test

production:
  <<: *default
  database: like-slack_production
  username: 
  password: 

よくみると、socketという箇所がありますよね。ここに、先ほどmysql_config –socketコマンドで確認したパスをコピペして貼り付けましょう。

ファイルを保存して、MySQLとRailsが正しく繋がっているかどうかを確認するために、rails consoleを立ち上げてみましょう。

bundle exec rails c

立ち上げたときに、

Loading development environment (Rails 5.1.2)
[1] pry(main)>

こんな感じで、エラーが出ることなくコンソールが立ち上がればOKです。

もし、接続できずエラーになってしまう場合は、次のセクションでchinjuさんと僕とのやりとりを参考にしてみてください。

次の見出しから紹介する対処法は、初期化してしまうので、どうしようもなくなった時の最終手段としてください。

chinjuさんとのやりとり

心が折れかけましたが、どうしても解決したかったので、これまでの経緯を chinjuさんに質問してみることに。

 

chinjuさん
chinjuさん

database.yml の設定かもです

Yuta
Yuta

mysqlの起動すらできないのですが、それもdatabase.ymlが関係してきますか?

chinjuさん
chinjuさん

あ、それは原因違いますね。`mysql.server resetart` ができないということですよね?

Yuta
Yuta

そうなんですよ、restartができない状況です。
ずっとこのエラーですね。。
ERROR! The server quit without updating PID file

 

chinjuさん
chinjuさん

brew で mysql 入れ直しから始めるのが吉だと思いますー

 

Yuta
Yuta

なるほど、ちょっとやって見ますー。

 

chinjuさん
chinjuさん

`brew remove mysql` かな。

 

Yuta
Yuta

どっちもやって見たんですけど、これってアンインストールされているんですかね?

 

Yutas-MacBook-Air:~ ushijimayuuta$ brew uninstall mysql
Warning: Use zlib instead of deprecated homebrew/dupes/zlib
Uninstalling /usr/local/Cellar/mysql/5.7.19… (322 files, 233MB)
mysql 5.7.18_1 1 is still installed.
Remove all versions with `brew uninstall –force mysql`.

Yutas-MacBook-Air:~ ushijimayuuta$ brew remove mysql
Uninstalling /usr/local/Cellar/mysql/5.7.18_1… (321 files, 232.9MB)
Yutas-MacBook-Air:~ ushijimayuuta$

 

chinjuさん
chinjuさん

`brew uninstall –force mysql` これかな。
ちょっと実行してみてくださーい。
一応アンインストールは成功してると思われます。
そのあとに `brew install mysql` です。

再び【bundle exec rails db:create db:migrate】を実行してみるも。。。

再びデータベース実行コマンドである

bundle exec rails db:create db:migrate

を叩いて見ました。

しかし結果は同じく

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock'

見慣れたエラー文がターミナルにまたしても出現。

どうしようもないので、chinjuさんの提案で全てのmysqlとその設定ファイルを削除することに。

ちなみに、手順については下記のサイトを参考にしました。

MacでMySQL5.7をアンインストールする

Qiitaの手順通りの後にPCを再起動してみると、icloudやDropboxからログアウトされるなどの弊害が。。

しかし、以下のコマンドをを叩いてみると、無事にMysqlに接続できました。

bundle exec rails db:create db:migrate

最後に

結局この記事を執筆時点では、なぜエラーがずっと解消されなかったのかという原因はわかってないです。。

次に同じエラーが発生した際には、再び初期化する事がないように原因を突き止められるよう、Mysqlの知識も勉強していきます。

当時の僕は、コマンドを叩く意味を理解しておらず、ただ闇雲にコマンドをコピペしていただけでした。

たくさんのエラーと戦っているうちに、対処法がわかるようになってきたので、今となってはエラーが出ても動じず、冷静に原因を突き詰められるようになりました。

今回の記事を読んでくれているあなたにとって、お役に立てたら嬉しいです。