ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'(38)に悩むあなたへ

# 初めに
phpフレームワークのLaravelでRESTfulAPIの設計をしようと思いmysqlを使ってみたところ上記のエラーが出ました。
その解決方法を残しておこうと思ったので書いておきます。
時間がなくいますぐにでも解決方法を知りたいあなたは
時間がないあなたへをみてください
もし時間があるあなたは解決までの道のりともしかしたら役に立つかもしれないをごらんください

# 前提条件
・mysqlをhomebrewでインストール済み
・mysql8.0系を使っていた
・mysql9.0へ移行しようと思っていた
・mysqlをなんどもインストールしては削除を繰り返してきた
これらに当てはまる方には参考になると思います

# 時間がないあなたへ
## 最速の解決方法
```
brew info mysql 
```
を実行するのが最速かと思います。ここでインストールされているmysqlの情報を取得します。
![スクリーンショット 2025-02-06 18.57.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/426c852f-2608-9712-b3e4-73d7220e4c5c.png)
するとこんな感じで情報が出てくるので"Caveats"を見ます。
MySQLのUpgrade手順が出てくるのでその方法を実行していきます。
### 1. 元々動いていたMySQLを止める
mysqlの更新には8.4のインストールが必要なのでそのインストールのために今まで動いていたmysqlを止めます。
```
brew services stop mysql
```
もしかしたらsudoがいるかも
### 2. mysql8.4のインストール
次にmysql8.4をインストールしていきます。
```
brew install mysql@8.4
```
### 3. mysql8.4の起動
インストールしたmysql@8.4を起動します
```
brew services start mysql@8.4
```
### 4. mysql8.4の停止
mysql@8.4を停止します
```
brew services stop mysql@8.4
```
### 5. mysqlの起動
mysqlを起動します
```
mysql.server start
```
### それでも無理なら・・・
mysql.sockを削除します
```
sudo rm -f /tmp/mysql.sock
```
もしかしたら```mysql.sock```が違うところにあるかも
削除できたら⑤をもう一度行ってください。
ここまでしたらsuccessが出ると思うので
```
mysql -u root
```
でmysqlを使えることを確認してください

### なぜmysqlの起動にmysql.serverをしようするのか
ここからは解決にあまり関係ないので時間がある人だけみてください
mysql@8.4の起動には```brew services```を使用していたのにmysql@9.0の起動には```mysql.server```を使用するのか
それはbrew servicesがmysql@9.0を対応していないかららしいです。
ChatGPTが教えてくれました。なので今後mysqlの起動や停止はmysql.serverを使用するのが無難かと思います。

# 解決法に至るまでの道のり
ここからは解決法に至るまでの道のりをご説明します。
ChatGPTに頼りながら思考錯誤しました。
## 1. brew info mysqlの実行
まずはhomebrewでインストールされたmysqlの状況を確認しました。

## 2. sudo brew services stop mysqlの実行
次に使っているmysqlを止めるようとしてsudoがないと怒られたのでsudoで実行しました

## 3. brew install mysql@8.4の実行
次にmysql@8.4をインストールしました

## 4. mysql -u rootの実行
mysqlをroot権限で使用できるかなと思ってやってみましたが
以下のエラー文が
```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
```
状況が変わらず絶望しましたがmysqlのサーバを起動していないことに気づきました

## 5. mysql.server startの実行
サーバを起動するために実行したのですが大量のログと以下のエラー文が
```
ERROR! The server quit without updating PID file (/usr/local/var/mysql/MacBook-Air.local.pid).
```
これではサーバを起動ができないよう

## 6. brew services stop mysqlの実行
今思えばサーバを起動していないのにこのコマンドを打つ必要はなかったと思います

## 7. brew services start mysql@8.4
homebrewを使ったらmysql@8.4を起動できました

## 8. mysql -u rootの実行
mysql@8.4を起動したのでrootで入れるかなと思ったのですが```4.```と同じエラーが出ました

## 9. brew services list
実行後mysql@8.4の状況を確認しました
```
Name      Status  User File

mysql@8.4 stopped ユーザー名   ~/Library/LaunchAgents/homebrew.mxcl.mysql@8.4.plist
```
起動したのに止まってる？どういうこと

## 10. mysql.server startの実行
```5.```と同じ状態でした。

## 11. ps aux | grep mysqlの実行
mysql関係のプロセスを確認してみると
grep mysqlしかありませんでした。

## 12. brew services stop mysqlの実行
ここにきて指示通りmysqlを停止しようとしました。mysqlは開始していないという警告が出ました。mysql@8.4を開始したのにmysqlが起動していないのは当たり前ですよね

## 13. brew services stop mysql@8.4の実行
ここで指示通りmysql@8.4を停止しました。成功です。

## 14. mysql.server stopの実行
ここでもmysqlを停止しようとしています。意味がありませんね

## 15. ps aux | grep mysqlの実行
mysqlのプロセスが動いていないことが確認できました

## 16. sudo rm -f /tmp/mysql.sockの実行
これは意味があるのか分かりませんが```4.や8.```で出たファイルの削除を行いました。

## 17. brew services start mysqlの実行
ここでエラー文が
```
Error: Formula `mysql` has not implemented #plist, #service or installed a locatable service file
```
ここからbrew servicesがmysqlには対応していないことが確認できます。

## 18. mysql.server startの実行
ここにきてSUCCESSが出て
```
mysql -u root
```
が使えることが確認できました。

# まとめ
結局ここまでの流れを完結にまとめると[最速の解決方法](##-最速の解決方法)にいきつくと思います
このエラーに1日費やしましたやばすぎ
この記事が素早いエラー解決に役立ってくれれば幸いです。

# 番外編
道のりにたどり着くのために色々なことを試しました。その中で効果がありそうなこととなさそうなことをまとめます
## もしかしたら効果があること
・mysql.serverファイル内のmysqld_safeの部分をmysqldに変更
→mysql9.0ではmysqld_safeは使われていないらしいので変更した

・mysqlディレクトリ(多分/usr/local/var/の下))のアクセス権を緩和
→root所有だったからユーザ所有に変更

・/tmp/mysql.sockがある確認
→あるならいいけどないなら作り直したほうがいいかも

## 多分効果がないこと
・mysqlのアンインストールとインストールを繰り返す
→僕は何回も試しましたが根本的な問題解決にはなりませんでした。
あきらめてエラーの根元を探してみることをおすすめします