前回
herokuを使ってデプロイ中に、急にMySQLとの接続が出来なくなった。
原因は、恐らくMySQLのバージョンが、Homebrew で 8.0.をインストールしてしまい MySQLが ver8.0 にアップデートされていた事が原因(だと思う)
奮闘の上、ようやくMySQLの起動に成功した。これでようやくrails sでアプリを起動出来ると思ったが、また新たなエラーが出た。
これは前回の記事の続きになります。
MySQL起動エラーの対処の仕方【Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)】
エラー内容
rails sが上手く行かず、ターミナル上に出たエラー文がこちら
/Users/kawaiyasuhiro/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require': dlopen(/Users/kawaiyasuhiro/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
Referenced from: /Users/kawaiyasuhiro/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle
Reason: image not found - /Users/kawaiyasuhiro/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle
重要な所はここ!
Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
要は、シンボリックリンクにて/usr/local/opt/mysql/lib/libmysqlclient.21.dylibファイルが見つからない為、エラーが起きている模様。
シンボリックリンクとは、UNIX系のOSにおいて、ファイルやフォルダに対する注文を代わりに受け付けて本来のファイルに中継するのを役目としている仲介役みたいなものです。
これがないから繋がらないっと言っているようです。
なので、/usr/local/opt/mysql/libの中身を下記のコマンドで確認してみましょう。
% ls -l /usr/local/opt/mysql/lib/
すると・・・
あれ!?
ls: /usr/local/opt/mysql/lib: No such file or directory
ファイルがない??
仕方ない、細かく確認してみよう。
% cd /usr/local/opt/
optフォルダに移行したので
% ls
mysql@5.6ってファルダがあった
% cd mysql@5.6
mysql@5.6フォルダに移行したので
% ls
そしたら下記の結果が出た
total 48000
-rw-r--r-- 1 hoge staff 3353852 10 8 05:11 libmysqlclient.18.dylib
-r--r--r-- 1 hoge staff 3866872 11 27 2019 libmysqlclient.a
lrwxr-xr-x 1 hoge staff 23 11 27 2019 libmysqlclient.dylib -> libmysqlclient.18.dylib
lrwxr-xr-x 1 hoge staff 23 11 27 2019 libmysqlclient_r.18.dylib -> libmysqlclient.18.dylib
lrwxr-xr-x 1 hoge staff 16 11 27 2019 libmysqlclient_r.a -> libmysqlclient.a
lrwxr-xr-x 1 hoge staff 20 11 27 2019 libmysqlclient_r.dylib -> libmysqlclient.dylib
-r--r--r-- 1 hoge staff 17344696 11 27 2019 libmysqld.a
-r--r--r-- 1 hoge staff 3472 11 27 2019 libmysqlservices.a
drwxr-xr-x 21 hoge staff 672 11 27 2019 plugin
libmysqlclient.21.dylibがなく、代わりにlibmysqlclient.18.dylibがある。
少し調べたところ、5.7 はlibmysqlclient.20.dylib、8.0 はlibmysqlclient.21.dylibを使用しているらしいということが分かった。
そして、5.6 はlibmysqlclient.18.dylibを使うみたいだ。
??
上記の理論で有れば ver 5.6 はlibmysqlclient.18.dylibが有ればいいのではないか?
他に問題あるのか?
bundle doctor
他の問題を解決する為に、
bundle doctorを使ってGemfileとgem環境をチェックしてみた。
% bundle doctor
(略)
The following gems are missing OS dependencies:
* mysql2: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib
エラー内容を確認すると、The following gems are missing OS dependencies:と、
以下のgemたちは、OSへの依存関係がありません、と出ています。
という事で、ここは一先ず、出ているgemsを1つ1つアンインストールしていきます。
今回は一つしか出てこなかったですが、複数出る場合もあります。
やり方は、bundle exec gem uninstall [gem名]です。
なので下記コマンドを打ち込みます。
% bundle exec gem uninstall mysql2
Successfully uninstalled mysql2-0.5.3
最下部に、Successfully uninstalled [gem名] と表示されればアンインストール完了です!
再びbundle doctor
% bundle doctor
(略)
Install missing gems with `bundle install`
とエラーが出るので、bundle installをします。
そして、本当に問題がないか再度bundle doctor
$ bundle doctor
(略)
No issues found with the installed bundle
これで解決!インストールされたbundleに問題はありませんっと
表示された。
なので、rails sでアプリを起動してみると・・・・・
上手くいった!!
ようやくこれで、全てのMySQLエラーの解決です。長がった。
まぁ、正確にはこのエラー解決するのにMySQLを一度アンインストールしているので、
データベースの作成とマイグレーションの実行をしないとダメですね(笑)
なので一応記載しておきます。
rails db:create
rails db:migrate
これで本当に終了です!
備考 - 結局、 Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError) のエラーは解決の仕方は、これで良かったのか?? 他の記事を見てみても同じやり方の記事が多くあったし、事実解決しているので大丈夫かと思うけど・・・
詳しく知っている方が、もしいらっしゃったら教えてください!
そもそも、根本的な問題としてMySQLのバージョンが、8.0.にアップデートされた原因が正直分からない・・・
プログラミング・・・奥が深すぎる