Mysql2::Error::ConnectionError への対処方法

# `Mysql2::Error::ConnectionError`への対処方法

RailsプロジェクトをRails_newで作成した後、開発環境にデータベースを生成しようと試みた際のエラーいついて、原因と対処法を、こちらに備忘録としてまとめておきます。


## エラー内容1
```
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Couldn't create '*****_*****_development' database. Please check your configuration.
rails aborted!
```

```terminal:日本語翻訳
ソケット「/tmp/mysql.sock」経由でローカルMySQLサーバーに接続できません (2)。
「*****_*****_development」データベースを作成できませんでした。設定を確認してください。
Railsが中止されました!
```

## エラー内容２
```
Caused by:
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

```terminal:日本語翻訳
Mysql2::Error::ConnectionError:のせいで： 
ソケット '/tmp/mysql.sock' を介して、
ローカルMySQLサーバーに接続できません (2)
```


## エラー発生までの経緯
- Ruby on Railsでアプリケーションを作成中
- Ruby、Railsをインストール
- Rails newコマンドを実行後、
- $ bundle exec rails db:createを実行したタイミングでエラーが発生した。


## 対処をしていく流れを記録

- `/tmp/mysql.sock`というファイルがあるか確認->なかった
- このファイルが存在しないことが原因かな？

#### `/tmp/mysql.sock`って何？　ChatGPTの回答

- `/tmp/mysql.sock`は、`MySQL`がローカル接続用に使用する`UNIXソケットファイル`のデフォルトのパス。
- `UNIXソケット`は、`同じマシン上のプロセス間でデータをやり取りするための通信手段`だ。この場合、Rubyのプログラムが`MySQLのデータベースと通信するために使用`する。
- ただし、これはあくまでファイルパスであって、`コードの一部ではない`。
- この`パスが指定されている場所`や、`それがどのように使われているか`によって、その扱い方や意味が変わる可能性がある。

#### `/tmp/mysql.sock`が存在するかを確認する。
```terminal
$ mysql_config --socket  # MySQLで設定されているSocketのパスを確認するコマンド
# #/tmp/mysql.sock ->これは良さそう。

$ ls -la /tmp/mysql.sock  # /tmp/mysql.sockが対象のディレクトリ配下に存在するか確認するコマンド
# # ls: /tmp/mysql.sock: No such file or directory
```

#### `/tmp/mysql.sock`をとりあえず作成する。
```terminal
$ cd ~/対象のディレクトリパス #対象のアプリディレクトリに移動してから、、、
$ touch /tmp/mysql.sock # /tmp/mysql.sockを作成する。
$ ls -la /tmp/mysql.sock # ->一応できたっぽい？
## -rw-r--r--  1 ****** wheel  0  9  1 09:49 /tmp/mysql.sock
```

- `-rw-r--r--`は、所有者のパーミッション、グループのパーミッション、他人のパーミッションといったものを示している。
- `r`は読み出し`w`は書き込みを示している。


#### もう一度`$ bundle exec rails db:create`を実行してみる。

```terminal
$ bundle exec rails db:create
```
またエラーになってしまうが、エラー内容は少し変わった。
```
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
Couldn't create '****_****_development' database. Please check your configuration.
```
エラーが（2）から38）に変わっただけだが、これはなんなのだろう?


#### `config/database.yml`内で socketの指定先が違っている可能性
とりあえず、database.ymlの中身を確認してみる。

```ruby
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost
  socket: /tmp/mysql.sock # ここがなかったので追記してみた。
```
もう一度`bundle exec rails db:create`を実行してみる。
```
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
Couldn't create '****_****_development' database. Please check your configuration.
```
エラーは変わらず、、、、

#### 可能性：MySQLサーバーを起動しないと、接続ができないということかもしれない。
- どうやら、自身で、以前にも同じような内容でハマっていたことがあったようだ。
- mysqlサーバーを起動すれば、 `/tmp/mysql.sock` が自動で生成されるらしい。
- 以下コマンドを試してみる。

```terminal
＄ mysql.server start

-> Starting MySQL
   SUCCESS! 
```
- 一旦、先ほど、指定した`database.yml`の`socket: /tmp/mysql.sock`という追記した部分は削除して、元に戻した。
- その上で、再度`$ bundle exec rails db:create`を実行してみる。

```
Created database 'app_name_development'
Created database 'app_name_test'
```
- データベース作成できました！
- Railsサーバーも立ち上がりました！



## まとめ
- `MySQL`でデータベースを作成する場合は、`MySQLサーバーを起動`していないとできない。
- `＄ mysql.server start`でMySQLサーバーを起動してから、`$ bundle exec rails db:create`を実行する。





## 参考サイト

https://qiita.com/aiandrox/items/22d532fe5942e4adab5a

https://qiita.com/tkmd35/items/c26d1dffca4be0a4f017

https://qiita.com/k-yasuhiro/items/95a60618d9743e3749a2