どうも、フリーランスエンジニア目指して奮闘中の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)
になるだけ。
この文をみるたびに思わず、
自分には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さんに質問してみることに。
database.yml の設定かもです
mysqlの起動すらできないのですが、それもdatabase.ymlが関係してきますか?
あ、それは原因違いますね。`mysql.server resetart` ができないということですよね?
そうなんですよ、restartができない状況です。
ずっとこのエラーですね。。
ERROR! The server quit without updating PID file
brew で mysql 入れ直しから始めるのが吉だと思いますー
なるほど、ちょっとやって見ますー。
`brew remove mysql` かな。
どっちもやって見たんですけど、これってアンインストールされているんですかね?
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$
`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とその設定ファイルを削除することに。
ちなみに、手順については下記のサイトを参考にしました。
Qiitaの手順通りの後にPCを再起動してみると、icloudやDropboxからログアウトされるなどの弊害が。。
しかし、以下のコマンドをを叩いてみると、無事にMysqlに接続できました。
bundle exec rails db:create db:migrate
最後に
結局この記事を執筆時点では、なぜエラーがずっと解消されなかったのかという原因はわかってないです。。
次に同じエラーが発生した際には、再び初期化する事がないように原因を突き止められるよう、Mysqlの知識も勉強していきます。
当時の僕は、コマンドを叩く意味を理解しておらず、ただ闇雲にコマンドをコピペしていただけでした。
たくさんのエラーと戦っているうちに、対処法がわかるようになってきたので、今となってはエラーが出ても動じず、冷静に原因を突き詰められるようになりました。
今回の記事を読んでくれているあなたにとって、お役に立てたら嬉しいです。