Railsアプリ起動時に突然「Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)」になった時の対処法

## はじめに
Railsアプリをローカルで起動させた際に、MySQLのConnectionErrorが発生しました。先日まで問題なく起動していたのですが……。

<img width="1318" alt="スクリーンショット 2020-01-19 22.35.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/35b66dd6-6814-db9c-2e84-9285da931352.png">

mysqlサーバーに接続する際、mysql.sockファイルを使って接続するらしいのですが、
なんらかの原因により、このファイルが消えることがあるそうです。
エラー文で指定されているところに、mysql.sockファイルを作成して再度接続してみました。

```
$ sudo touch /tmp/mysql.sock
$ sudo mysql.server restart
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/MBP-2.local.pid).
```
<img width="1318" alt="スクリーンショット 2020-01-20 19.17.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/ff0157c9-bd33-ba4e-1737-170386aa71e5.png">

エラー画面の`(2)`が`(38)`に変わっただけです。
検索するとこの類のエラーは結構頻発するらしく、まずは権限周りから触ってみました。

```
$ sudo chown mysql:mysql /tmp

$ sudo chmod 777 /tmp/mysql.sock

$ mysql.server start
Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/MBP-2.local.pid).

$ sudo touch MBP-2.local.pid

$ sudo rm /tmp/mysql.sock

$ chown -R _mysql:_mysql mysql

$ sudo chown UserName /tmp/mysql.sock
$ mysql.server start
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/マシン名.local.pid).
```
以上の内容を色々試してみたのですが解決せず。Macを再起動しても何も変化なしでした。
MySQLをhomebrewでインストールしていたので`/usr/local/var/mysql`をディレクトリごと消去して再インストールしました。

```
$ sudo rm -rf /usr/local/var/mysql

$ brew uninstall mysql@5.7
Uninstalling /usr/local/Cellar/mysql@5.7/5.7.28... (319 files, 232.2MB)

$ brew install mysql@5.7
・
・
mysql@5.7 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.
If you need to have mysql@5.7 first in your PATH run:
  echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc
・
・
🍺  /usr/local/Cellar/mysql@5.7/5.7.29: 319 files, 232.3MB
```

再インストールだけだとパスが通っていないのでexportコマンドでパスを通すように設定します。

```
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc
$ sudo vi ~/.zshrc
export PATH=/usr/local/bin:$PATH
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"
$ source ~/.zshrc
```

まずはMySQLがインストールされているか確認します。

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for osx10.15 (x86_64) using  EditLine wrapper
```

続いてMySQL5.7を起動させます。

```
$ brew services start mysql@5.7
==> Successfully started `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)
```
起動させるRailsアプリのデータベース設定ファイルは以下のようになっています。

```database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: test-user
  password: password-example
  socket: /tmp/mysql.sock
```

指定しているユーザーでMySQLに接続してみます。

```
$ mysql -u test-user -ppassword-example
ERROR 1045 (28000): Access denied for user 'test-user'@'localhost' (using password: YES)
```

接続エラーとなりました。MySQLを再インストールしたためにtest-userが消去されているようです。
試しに現在のユーザーリストを確認すると、

```
$ mysql -u root -p
・
・
・
mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
```
確かに、ユーザーリストに`test-user`が存在していませんので再度ユーザーを作成します。

```
$ mysql -u root -p
・
・
・
mysql> CREATE USER 'test-user'@'localhost' IDENTIFIED BY 'password-example';
Query OK, 0 rows affected (0.12 sec)


mysql> SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| test-user        | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
```

ユーザーの作成ができたので権限付与も合わせて行います。今回はテストなので全てのデータベースにアクセスできる権限を付与しました。

```
mysql> GRANT ALL ON *.* TO 'test-user'@'localhost';
Query OK, 0 rows affected (0.05 sec)
```

再度、MySQLに接続してみます。

```
$ mysql -u test-user -ppassword-example
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  
・
・
・
mysql>
```

接続できましたので、続いてデータベースを作成します。

```
$ bundle exec rails db:create
Created database '[アプリケーション名]_development'
Created database '[アプリケーション名]_test'
```

未実行のマイグレーションファイルを全て実行し、データベースにテーブルを作成します。

```
$ bundle exec rails db:migrare
== 20200117122858 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0093s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0302s
・
・
・
```

以上で設定終了です。再度Railsアプリを立ち上げてみます。
<img width="1425" alt="スクリーンショット 2020-01-25 6.40.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/ec9084f8-293a-0358-84d5-aae2ba8400be.png">

無事に立ち上がりました。急にエラーが出て結構焦りましたが、いい勉強になりました。


##参考記事
https://qiita.com/tosite0345/items/3f346780e14feca48f55
https://weblabo.oscasierra.net/mysql-57-homebrew-install/
https://qiita.com/gatapon/items/92b942fa7081cfe17482
https://qiita.com/kskumgk63/items/b308c0a688c358b17162
https://qiita.com/pugiemonn/items/718b7360028286c5b626