ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)の俺なりの解決法

このエラーにぶち当たった時、今までQiitaの記事をテキトーに見て、テキトーにコマンド実行してこのエラーをやり過ごしてたが、
毎回テキトーにやり過ごす時間が無駄だし、今回このエラーにぶち当たって、なぜかテキトーにやりすごせなくなってるし、何より成長しないしってことで私がなんとか噛み砕いて説明したいと思いますーー。
尚実務未経験の初学者が書いているので、間違っていると思います。。。
編集リクエスト、コメントでの指摘等よろしくお願いいたします。。。。

追記[色々勉強になったが解決無理だった]


# このエラーが出るまでの前提

```
rails s
```

を実行したら

```
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

と言うエラーが出た。ググってみると

# このエラーの解決方法

https://qiita.com/carotene4035/items/e00076fe3990b9178cc0

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

railsとMySQLの通信するためのファイルが無い。ってエラーなのか。
ってか自分の場合毎回消えてるから何故なのかも気になる。。。
Qiitaの記事を見てデバッグしていいものなのか。。だがここに書いてあったことを信じて

```
sudo touch /tmp/mysql.sock
```

を実行。

```
mysql.server restart
```

お願いしまぁぁす！！


 ERROR! MySQL server PID file could not be found!
Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/SoichironoMBP.pid).

とエラーが出た。

PIDファイルが無いよー的な感じのエラーらしい。
PIDファイルってなんやねん。って感じで調べてみる。

https://rooter.jp/infra-ops/mysql-pid-host/

>PIDとはプロセス識別子と呼ばれるもので、ある時点で存在するプロセスを一意に識別するために用いられます。優先順位を調整したり、終了させたり等、プロセスを操作する様々な関数の引数として使われます。そして、このPIDファイル名にはホスト名が使われています。

MySQLのプロセスを管理してくれるのやろうか。

少し脱線するけど、改めてプロセスの意味を確認
https://jp.quora.com/puroguramu-to-purosesu-to-sureddo-to-tasuku-no-chigai-tte-nani-desu-ka
僕はこの記事を見てもイマイチ分からなかったので、
https://wa3.i-3-i.info/word11032.html

ざっくり説明すると、プロセスとは実行中のプログラム。

**まぁ要するに、MySQLが今何をやっているかを管理するためのファイルが無い。**

ってことなのかもしれん。

# そもそもなぜERROR! The server quit without updating PID file (/usr/local/var/mysql/SoichironoMBP.pid).とエラーが出るのか


https://rooter.jp/infra-ops/mysql-pid-host/

>Macの場合ですが、ホスト名が明示的に設定されていない場合、ネットワークが変わるとホスト名も変わってしまうということが考えられます。ホスト名が変わってしまうと、PIDファイル名も変わってしまうのです。

PIDファイルがあるのに、このエラーになる場合はこういった原因。

```
$sudo scutil --get HostName
```

これで自分のMacのホスト名を表示できるみたいですが、
自分の場合は、HostName: not set
と出力されました。

>先ほどにも述べたように、Macでは繋げているネットワークが変わると、ホスト名も変わってしまいます。Macのホスト名は ComputerName,HostName,LocalHostName があります。これらが設定されていないと、自動でホスト名を割り当てられてしまう可能性があります。つまり、あるネットワークでmysqlサーバを起動し、別のネットワークでサーバを終了させようとすると、起動した時のPIDファイルが必要になるため、エラーが起きてしまいます。


そもそも、ホストとは、、、？？
ってなってしまったので、調べてみる
https://e-words.jp/w/%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D.html

>ホスト名とは、ネットワークに接続されたコンピュータなどの機器を人間が識別・指定しやすいように付けられる名前

ハードウェアに名前が付けられているらしい。

>Macのホスト名は ComputerName,HostName,LocalHostName があります。


```
sudo scutil --get ComputerName
```

を実行すると、SoichiroのMacBook Proとなった。

```
sudo scutil --get LocalHostName
```

を実行すると

SoichironoMacBook-Proが返ってきた。


https://rooter.jp/infra-ops/mysql-pid-host/
この記事に
>ホスト名が変わったことで探しに行くPIDファイル名の名称が更新され、一致するPIDが無い（MySQL server PID file could not be found!）というエラー発生に至ったと思われます。

と書いてあったので、ホスト名が変わると色々ややこしいから、ホスト名を設定してしまえば



```
sudo scutil --set HostName SoichironoMacBook-Pro

```

とセットすることにした。

# 話を戻して、 ERROR! MySQL server PID file could not be found!の解決法
https://qiita.com/jonakp/items/477a18d4a94c01a31583
上記の玉稿を拝見して参考にしました。

1.pidファイルが存在してない
2.pidファイルに適切な権限が設定されていない

この二つが主に原因らしいが、まず１から疑ってみよう。

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

自分の場合

... ERROR! The server quit without updating PID file (/usr/local/var/mysql/SoichironoMBP.pid).

このエラーだったので、

```
sudo touch /usr/local/var/mysql/SoichironoMBP.pid

```

を実行。

```
mysql.server restart           
```

をする。

 ERROR! MySQL server PID file could not be found!
Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/SoichironoMacBook-Pro.pid).

とエラーが返ってきた。

となると、2.pidファイルに適切な権限が設定されていない。可能性がある。

>pidファイルはあっても、mysqlに権限が無いとエラーになる様子。
/user/local/var/mysql以下のファイルの所有者をすべて_mysqlにすることで解決。


とあった。

```
sudo chown -R _mysql:_mysql /usr/local/var/mysql/
```

このコマンドを実行すればいいらしい。がイマイチこのコマンドの意味が分からないので
調べてみることに

chownはファイルやディレクトリ の所有者を変更するコマンドらしい。
ん？？このマックの所有者俺だし、俺のMac上に存在してるであろうMySQLに関するファイルの所有者俺じゃ無いの、、、？？？
どゆこと？？

-Rオプション(--recursiveオプション)は、
カレントディレクトリ配下のファイルやディレクトリの所有者を変更できる。
らしい。

```
$ who
```

でユーザー名が確認できて、
soichirohara console  Aug  3 22:48 
soichirohara ttys000  Aug  3 22:49 

このような表示になった。

ちなみにこれらの対処法を試していたら

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (61)
とエラー内容が変わった。。。初めて見た。。。。


activerecord (6.1.3.1) lib/でエラーが出ていたので、
本当に試しで、**database.yml**を

```yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```

とsocketを/tmp/mysql.sock  　から/var/lib/mysql/mysql.sockに変更

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

とエラーが出た。

sudo touch /var/lib/mysql/mysql.sock
と実行したら

touch: /var/lib/mysql/mysql.sock: No such file or directory

sudo mkdir mysqlを実行


mysql.server start

Starting MySQL
... ERROR! The server quit without updating PID file (/usr/local/var/mysql/SoichironoMacBook-Pro.pid).
またこのエラーが出た

ソケットを変えても根本的な解決にはならなそう。

# ファイルを作っても権限が問題そうなので、権限について勉強しようかな。。。

## chownについて解説

https://webkaru.net/linux/chown-command/
上記の玉稿を参考にして、書きます。

ってことで勉強。

```
chown [オプション] ユーザー[:グループ] ファイル
```

ちょうんって読むの？change ownerの略らしい。

>chownコマンドは指定したファイルやディレクトリ のユーザー所有権(所有者)やグループ所有権を変更します。


mac上にあるファイルは全部自分のものだと思っていたが、どうやらそうでも無いらしい。

オプション
-c	所有権が変更された場合、その詳細を表示します。
-f	エラーメッセージを表示しません。
-h	指定したファイルがシンボリックリンクの場合、シンボリックリンクのみ所有権を変更します。システムファイルやディレクトリの所有権を一括で変更する場合はこのオプションを使いましょう。
-R	指定したディレクトリとそのディレクトリ以下のファイルやディレクトリの所有権を再帰的に変更します。
-v	所有者変更の詳細を表示します。-cは、変更された場合のみ。


シンボリックリンクとは
https://wa3.i-3-i.info/word1151.html
>まぁ「シンボリックリンク」って単語が出てきたら「ファイルやフォルダの代理人ファイルなんだな～」と、お考えください。

いや、全部読んだけど分かりやす。

指定したディレクトリとそのディレクトリ以下のファイルやディレクトリの所有権を再帰的に変更します。

って意味がよく分からないので、訳すと

https://www.weblio.jp/content/%E5%86%8D%E5%B8%B0%E7%9A%84#:~:text=%E5%86%8D%E5%B8%B0%EF%BC%88%E3%81%95%E3%81%84%E3%81%8D%EF%BC%89%E3%81%AF%E3%80%81%E3%81%82%E3%82%8B,%E3%82%92%E5%86%8D%E5%B8%B0%E7%9A%84%E5%AE%9A%E7%BE%A9%E3%81%A8%E3%81%84%E3%81%86%E3%80%82

>再帰（さいき）は、あるものについて記述する際に、記述しているものそれ自身への参照が、その記述中にあらわれることをいう。定義において、再帰があらわれているものを再帰的定義という。自己相似の記事も参照のこと。

なんだろ、「ディズニーランドとは、ディズニーキャラクターがたくさんいるテーマパークである」的な感じっすかね。。。

https://qiita.com/OTAGRAMER/items/0feab9fbf02e07a44915

https://www.te-nu.com/entry/2018/09/06/223303
再起関数とかヒットしたので、それで再起的ってIT用語を勉強することに、、、

再起関数とは

関数Aの中で同じ関数Aを使う処理を行う関数のことです。

def A(num)
  A(5)
end


ユースケースはわからんが、なんとなくイメージは掴んだ。

https://qiita.com/t-a-run/items/239ed690ece7a011804a
この記事も参考にさせていただきました。

指定したディレクトリごと権限を変更したい場合に-Rをつけたらいいらしい。
指定したディレクトリ配下のファイルも全部権限が変わる感じでしょうか。

んで、肝心のmysql serverのpidファイルは

```
soichirohara@SoichironoMacBook-Pro coffee_passport % ls -l /usr/local/var/mysql/SoichironoMacBook-Pro.pid

-rw-r--r--  1 root  _mysql  0  8  5 13:37 /usr/local/var/mysql/SoichironoMacBook-Pro.pid
```


こんな感じになっていた。
https://qiita.com/shisama/items/5f4c4fa768642aad9e06

上記から-rw-r--r--は、
「ファイル種別」が「ファイル」であり、
「所有者」に「読み取り」と「書き込み」の権限があり、
「所有グループ」に「読み取り」の権限があり、
「その他」に「読み取り」の権限があることを示しています。

ファイルはあるので、権限周りでやっぱりエラーがありそうですよねー


# 改めて、pidファイルエラーの解決

https://qiita.com/jonakp/items/477a18d4a94c01a31583

```
sudo chown -R _mysql:_mysql /usr/local/var/mysql/
```

を実行

自分の場合は、ファイル所有者がrootになってたからよろしくなかったのでしょう。
なんで、rootだとあかんのかがよくわからん。。。

```
ls -l /usr/local/var/mysql/SoichironoMacBook-Pro.pid

-rw-r--r--  1 _mysql  _mysql  0  8  5 13:37 /usr/local/var/mysql/SoichironoMacBook-Pro.pid

```

ファイル所有者が変わりました。

soichirohara@SoichironoMacBook-Pro coffee_passport % sudo  mysql.server start 
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/SoichironoMacBook-Pro.pid).


ってなった。。。

```

sudo ls -l /usr/local/var/mysql/SoichironoMacBook-Pro.pid

ls: /usr/local/var/mysql/SoichironoMacBook-Pro.pid: No such file or directory

```

所有者が変わったので、そんなファイルないってなるのかーー。。
じゃあどうすればええねん。。。

sudo less /usr/local/var/mysql/$(uname -n).err

これで起動時のエラーログが見れるらしい。。(最初から見とけよ)


# Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

とエラーが出てた。。。



だるいからドッカー で起動することにする。


って考えると簡単に環境構築できるdockerバイセンやばくね。


結果、無理だった。