MySQL起動エラーの対処の仕方【Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)】

前回
-
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' (３８)】](https://qiita.com/k-yasuhiro/items/95a60618d9743e3749a2)
<br>
エラー内容
-
`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
```
重要な所はここ！
<font color="red">Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)</font>

要は、シンボリックリンクにて`/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`が有ればいいのではないか？

他に問題あるのか？
<br>
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名] と表示されればアンインストール完了です！
<br>
再び`bundle doctor`

```
% bundle doctor
(略)
Install missing gems with `bundle install`
```
とエラーが出るので、`bundle install`をします。
<br>
そして、本当に問題がないか再度`bundle doctor`

```
$ bundle doctor
(略)
No issues found with the installed bundle
```
これで解決！インストールされたbundleに問題はありませんっと
表示された。

なので、`rails s`でアプリを起動してみると・・・・・

上手くいった！！
ようやくこれで、全てのMySQLエラーの解決です。長がった。

まぁ、正確にはこのエラー解決するのにMySQLを一度アンインストールしているので、
データベースの作成とマイグレーションの実行をしないとダメですね（笑）

なので一応記載しておきます。
```
rails db:create
rails db:migrate
```

これで本当に終了です！

<br>
<br>
備考
-
結局、
Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
のエラーは解決の仕方は、これで良かったのか？？
他の記事を見てみても同じやり方の記事が多くあったし、事実解決しているので大丈夫かと思うけど・・・

詳しく知っている方が、もしいらっしゃったら教えてください！

そもそも、根本的な問題としてMySQLのバージョンが、8.0.にアップデートされた原因が正直分からない・・・
プログラミング・・・奥が深すぎる