【MySQLエラー】 ERROR! The server quit without updating PID file

鬼門のSQLエラー...
なかなかはまったので解決までに試したことを記述します。

# エラーに到るまで
PCの動作が重くCPUファンも常に回ってるような状況だったので、再起動してみることに。
再起動...おっ！治ったっぽい:grin:

しかしmysqlサーバー立ち上げようとしたら

```:ターミナル
ERROR! The server quit without updating PID file
```
のエラー発生:weary:

# 環境確認

```:ターミナル
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6

$ mysql --version
mysql  Ver 14.14 Distrib 8.0.18_1, for osx10.14 (x86_64) using  EditLine wrapper

$ ls /usr/local/Cellar/mysql*
/usr/local/Cellar/mysql:
8.0.18_1

/usr/local/Cellar/mysql@5.7:
5.7.28
```

パスの確認もしておきます。

```:ターミナル
$ cat .bash_profile
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"
```

# 試したこと
ここから解決法として記事はあるけど<font color="Red">解決しなかった</font>方法を記述します。
結果どうしたかだけ見たい方はこちらからどうぞ。
[解決法](#解決法)

## 1.MySQL8系のアンインストール
まず環境確認した時に、mysql8系と5系の二つインストールされてること、パスはmysql5.7であることを確認。(8系インストールした記憶ない)

とりあえず8系いらないのでアンインストール。

```:ターミナル
$ brew uninstall mysql
```

## 2.pidファイルがない？
参照：[mysql 起動時のThe server quit without updating PID file エラーの回避法](https://qiita.com/jonakp/items/477a18d4a94c01a31583)

まずは`The server quit without updating PID file`エラーメッセージに従ってpidファイルが存在しているか確認。

```:ターミナル
$ ls /usr/local/var/mysql
```
`[マシンのホスト名].local.pid`の存在を確認。
ホスト名は`uname -n`で確認できる。
なければpidファイルを作りましょう

これが原因ではなさそう。

## 3.pidファイルに権限が設定されていない？

mysql以下のファイルの所有者をすべて_mysqlにする。

```:ターミナル
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql/
```

## 4.リンクを切り替えてみる

参照：[MacのOSをアップデートした後にMySQLが使えなくなった場合の対処方法](https://qiita.com/owlbeck/items/fff7125d3f56dfde8b50)

mysql8系にリンクが設定されていた可能性も考えて、(先ほどアンインストールしましたが)mysql5.7にリンクを付与してみます。

```:ターミナル
$ brew link --force mysql@5.7
```

## 5.サーバーが複数起動してる？
参照：[mySqlサーバを止められなくなったとき](https://qiita.com/yukihigasi/items/a1c84b14ad6807896003)

状態の確認から。

```:ターミナル
$ mysql.server status
 ERROR! Multiple MySQL running but PID file could not be found (87129 87225 )
```
`PID file could not be found (87129 87225 )`このプロセスIDを停止させます。

```:ターミナル
$ sudo kill 87129
$ sudo kill 87225
```

プロセスの確認をします。

```:ターミナル
$ ps ax | grep mysql
xxxxxxxxxxxxxxxxxxxxxxxx...grep mysql
```
語尾に`grep mysql`とつくプロセスのみ残っていることを確認。

これが原因かなと思ったんですがダメでしたね。

## ※ 番外

[mysqlが起動できない！のエラーが出るときの対処法](https://qiita.com/kei_rails/items/33c2b952e00ff6c381bc)

~~これは試してないんですが次何かしらのエラーが出た時に試したいと思います。~~
知人で同じエラー出たので試したところ有効な手段でした。

```:ターミナル
$ tail -f /usr/local/var/mysql/***.err
```
上記コマンドを打って、他のターミナルで

```:ターミナル
$ mysql.server start
```
と打つと`[ERROR]`となっている箇所があるらしくそこにエラーの内容が書いてあるそうです。

# 解決法

結局再インストールしました。

```:ターミナル
$ brew uninstall mysql@5.7
$ brew install mysql@5.7

.
.
.

$ sudo mysql.server start
Starting MySQL
. SUCCESS!
```

# 補足(Railsアプリケーション立ち上げまで)
ひとまずmysqlエラーは解決しましたが、ここからRailsアプリケーション立ち上げるまでも結構はまったので対処法を記述します。

## mysqldumpファイルをリストア

まずは`mysqldump`でバックアップをとってあればリストアしてDBを復元しましょう。
(私は1ヶ月前までのものしかバックアップしてませんでした:cold_sweat:)

```:ターミナル
$ mysql -u root -f < hogehoge.sql
```
<font color="Pink">-fオプションでエラーを無視して実行します</font>

## DBの作成
バックアップ漏れしていたデータベースを作成します。

```:ターミナル
$ bundle install
$ bundle exec rails db:create
```
ですんなりいくかとおもいきやここでエラー。

どうやらGemを入れ直す必要があるそうです。
`MySQLがある状態でbundleしないと整合性が取れない?`らしく、`今はbundleされていてMySQLをインストールしてきている状態`のためMySQLでエラーが出ていたそうです。

なので、`vendor`ディレクトリと`Gemfile.lock`ファイルを削除して改めて`bundle`しなおすとうまくいきます。

1. venderとGemfile.lockを削除
2. `bundle install --path vendor/bundle`
3. `bundle exec rails db:create`
4. `bundle exec rails db:migrate`

※railsコマンド時には`bundle exec`をつけると`vender`ディレクトリ以下を指定して実行することができ、グローバルな環境に作用されないため予期せぬエラーを防げます。

# まとめ
結局原因はわからず再インストールという形で解消。
考えられる原因がわかる方はぜひ教えていただけると嬉しいです！

今後はこまめにバックアップ取ろうと思います:sweat_smile: