MySQL起動エラーの対処の仕方【Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)】

経緯
-
herokuを使ってデプロイ中に、急にMySQLとの接続が出来なくなった。。。
原因は、恐らくMySQLのバージョンが、いつの間にか ver 8.0 にアップデートされていた事が原因っぽい。。。
ちなみに今迄使っていたのは ver 5.6

こんな事が起きたのが初めてだったので、色々弄り過ぎて解決するのにかなりの時間を費やしてしまった。
このやり方が有っているのか不明だが、誰かのお役に立つかと思い残しておきます。

ちなみに余談だが、herokuを使ってデプロイするならこの記事が一番良いので紹介だけしておきます。
[【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39)
<br>
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (３８)
-
作成中のアプリの画面がエラー画面に！エラー文が以下のもの
<font color="red">Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)</font>
これは、「ソケット /tmp/mysql.sock を通じてローカルのMySQLサーバーに接続することができません」という意味です(訳しただけですが)

ソケットとは、Unixドメインソケット(ファイルシステムソケット)の事で、ローカルシステム内での通信を行う際に、このファイルの入出力を通じてサーバーとクライアント間での通信を行います。
つまり仲介役ですね。

では、このエラーの対処の方法を説明したいと思います。
<br>
MySQLサーバーが起動していない
-
一番ベターな解決作ですが、只純粋にMySQLが起動していない事が原因かもと思い、
`% mysql.server start`　を打ち込む。

すると

```
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
```

`*******`は自分のコンピューター名が入ります。
また、多くの記事では`******.local.pid`って出ているのですが
この違いは不明です（寧ろ誰が教えて！）

ちなみに、このエラーは前のMySQLバージョンで使用したデータを使って起動した時に出るようです。
<br>
/usr/local/var/mysql配下のpidファイルが無いって言われているようなのでこのディレクトリを確認
`% cd /usr/local/var/mysql`
`% ls`
のコマンドで確認した所、`******.local.pid`は存在したが、`******.pid`は無い
ということで、pidファイルを作成する

`% sudo touch /usr/local/var/mysql/******.pid`

本当に出来たか確認する為、もう一度上記のコマンドでディレクトリを確認
うん！有った！


これで行けるかと思いもう一度

```
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
```
全く変わらずまた同じエラー
<br>

ここからの対処
-
色々エラーを検索して、分かった事だが上記でも記載している通り原因は、
MySQLの ver が5.6 →8.0 のアップデートされてしまい、
ERROR! The server quit without updating PID file は前のMySQLバージョンで使用したデータを使って起動した時に出るという事

ちなみに余談だが、8.0 は良い意味でも悪い意味でセキュリティーが上がっているようで
Sequel pro（ホットケーキがアイコンのもの）の対応できていない。
これらの事から、元の状態に戻す、つまりver を 5.6 に戻す方が早いのではっと考え
8.0 をアンインストール後、5.6　をインストールし直す事にした。
<br>

３つの行った事
-
・ MySQL8.0 をアンインストール
・ プロセスを確認
・ 権限の確認

の３つを行い成功した

<br>

MySQL8.0アンインストール＆MySQL5.6再インストール
-
※実行の前に注意する事としては、MySQLのデータが削除されてしまいますので注意
 僕はデータが消えても問題なかったのでそのままやっちゃいました。
 もし気になる方は下記の記事を参考にして見てください、アンインストールの方法もこの記事を参考にしてます
 [The server quit without updating PID file　mysqlエラー解決方法](https://qiita.com/kazu_wsx/items/bb787e9e4e919da03705#1%E3%81%BE%E3%81%9Alocal%E9%85%8D%E4%B8%8B%E3%81%AEmysql%E3%82%92%E5%85%A8%E3%81%A6%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B)
<br>

brewコマンドを使ってアンインストールします
`% brew uninstall mysql`
`% brew uninstall --force mysql`
`% brew cleanup -s mysql`
`% brew prune`
<br>
続いて、
`% rm -rf /usr/local/mysql`
`% rm -rf /Library/StartupItems/MYSQL`
`% rm -rf /Library/PreferencePanes/MySQL.prefPane`
`% rm -rf /Library/Receipts/mysql-.pkg`
`% rm -rf /usr/local/Cellar/mysql*`
`% rm -rf /usr/local/bin/mysql*`
`% rm -rf /usr/local/var/mysql*`
`% rm -rf /usr/local/etc/my.cnf`
`% rm -rf /usr/local/share/mysql*`
`% rm -rf /usr/local/opt/mysql`
brew uninstall mysql　では削除できないファイル群を削除します。

多くの記事でコマンドのmysqlの後にverを指定していないので大丈夫かと思いますが
僕は心配だったのでverを入れたコマンドも一緒に打ち込みました(笑)
こんな感じですね
`% brew uninstall mysql@8.0`

ver の確認方法は、
`% mysql --version`
これでもわかります
`% which mysql`
<br>
そして、インストールしたい ver を指定して打ち込みます。
`% brew install mysql@5.6`

これで全部スッキリ綺麗に入れ直しが出来たはずです！
<br>
そして、このままでは、MySQLのコマンドが一切反応してくれません。なのでパスを通しましょう。
下記の２つのコマンドです。
`% echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.zshrc`
`% source ~/.zshrc`

一応MySQLのコマンドが打てるか確認
`% which mysql`
以下のように表示されれば成功です
/usr/local/opt/mysql@5.6/bin/mysql
<br>
もしかしたら、これで起動するかもなので一応確認して見てください
`% mysql.server start`

僕はダメでしたが、、、変わらずこのエラー
またお前か・・・

```
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
```
<br>

プロセスを確認
-
ここでプロセスを確認です。
要はどういう事かというと、ver 5.6 を起動したいのに 8.0 が起動したままでは、
エラーが出るので、もし起動中のままだったら強制終了しましょうっていう確認です。

下記のコマンドで確認出来ます。
`% ps -ef | grep mysql`

余計なものが起動していると下記のように表示されます。
１行目、２行目が余計ですね。
３行目は、なきゃいけないものですのでオッケーです。


```
  501   699     1   0 16 720  ??         0:00.04 /bin/sh /usr/local/opt/mysql@8.0/bin/mysqld_safe --datadir=/usr/local/var/mysql
  501   974   699   0 16 720  ??         1:06.51 /usr/local/opt/mysql@8.0/bin/mysqld --basedir=/usr/local/opt/mysql@8.0 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@8.0/lib/plugin --log-error=XXXX-Air.local.err --pid-file=XXXX-Air.local.pid
  501  3524 81032   0  1:48AM ttys002    0:00.00 grep mysql
```

問題ない時は下記のような感じで出ます。

```
501  3524 81032   0  1:48AM ttys002    0:00.00 grep mysql
```
では、killコマンドで強制終了(-9)させましょう。

`% kill -9 974`
（974は上記のプロセスIDです)
一個強制終了させれば、上記で言えば699も一緒に消えると思いますが
消えてない場合はもう一回killコマンドで消してください。

最後に確認の為もう一度下記のコマンドを打って確認してください。
`% ps -ef | grep mysql`

しつこいですが、
もしかしたら、これで起動するかもなので一応確認して見てください
`% mysql.server start`

僕は、またまたダメでしたが、、、変わらずこのエラー
またまたお前か・・・

```
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
```
<br>

権限を確認
-
権限は、ユーザー名ではないと、Permission denied（アクセス権限がない）と
いう事でエラーが出るらしいのでこれを確認

このコマンドで確認
`% ls -la /usr/local/var/mysql`

```
% ls -la /usr/local/var/mysql                                               
total 221232
drwxrwxrwx  10 _mysql  admin       320 10  8 05:19 .
drwxrwxr-x   7 _mysql  admin       224 10  8 05:11 ..
-rw-rw----   1 _mysql  admin        56 10  8 05:19 auto.cnf
-rwxrwxrwx   1 _mysql  admin  50331648 10  8 05:19 ib_logfile0
-rwxrwxrwx   1 _mysql  admin  50331648 10  8 05:11 ib_logfile1
-rwxrwxrwx   1 _mysql  admin  12582912 10  8 05:19 ibdata1
-rwxrwxrwx   1 _mysql  admin     18507 10  8 05:19 ******.err
drwxrwxrwx  81 _mysql  admin      2592 10  8 05:11 mysql
drwxrwxrwx  55 _mysql  admin      1760 10  8 05:11 performance_schema
drwxrwxrwx   2 _mysql  admin        64 10  8 05:11 test
```

<br>
_mysqlの所がユーザー名ではないとダメらしいので変更する
`% sudo chown -R $USER /usr/local`
$USERのまま打ち込めばユーザー名に変更してくれるのでこのまま打ち込んでください

これで変更されたはずなので、再度確認して見てください。
`% ls -la /usr/local/var/mysql `

※逆に、_mysqlのままではないとダメという記事も多数見かけますが、
 どっちが正解なのか、すみません僕にも分かりません・・・
 僕はこっちではないとダメでした。
 わかる方が入れば教えて頂ければ有難いです
<br>

さぁ、これでどうだ！

・・・・・・またまたまたダメでしたが、、、変わらずこのエラー
またまたまたお前か・・・

```
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/*******.pid).
```
<br>

が、最後にエラーの通りもう一度
`% sudo touch /usr/local/var/mysql/******.pid`
をしたら
`% mysql.server start`                            
Starting MySQL
. SUCCESS! 
<br>
やっと、起動した・・・
なんて大変なのだ・・・

しかし、まだ僕の戦いは終わりませんでした。
MySQLは無事起動しましたが、またしてもエラーが出ました・・・・
次の記事では、その対処法について記載します。
[MySQL起動エラーの対処の仕方【Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)】](https://qiita.com/k-yasuhiro/items/9674d2e6e0b0fac3e1a8)

<br>

余談
-
余談ですが、
MySQLは本来であればPC再起動のたびに起動し直す必要がありますが、それは面倒であるため、
自動で起動するよう出来ます。それが、下記のコマンドです！
是非知らない方は、やっておいた方が便利ですよ！

```
% mkdir ~/Library/LaunchAgents 
% ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
% launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 
```