【MySQL】プログラミング初心者が今まで遭遇したエラーとその解決方法のメモ

こんばんは！スージーです！
なかなか技術ブログが書けずにモヤモヤしていたので、ちょうど良いネタがあり備忘録も兼ねて。

#MySQLに接続できないエラー

私は度々、MySQLに接続できずに四苦八苦しています。pidファイルないよーとかsocketないよーとか、その度に過去のメモや参考記事をあちこち探しているのでまとめてみようと思います。

## 参考

> - 【MySQL】pid not foundもしくはpermission deniedの対応方法
https://qiita.com/AK4747471/items/36b73edd9d1e666ae0c0
> - RailsプロジェクトでMySQLがbundle installできなかった
https://qiita.com/akito19/items/e1dc54f907987e688cc0
> - Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)
https://note.com/shoki_rails/n/nf7b51ba48084
> - mysqlのsocketエラーでrailsアプリが起動できない
https://qiita.com/fujitora/items/d341c52706d1954cae28
> - mysqld_safe A mysqld process already existsが出た時の対処方法
https://www.takafumitaba.com/mysql-already-exists
> - MySQLが再起動しなくなったときに行う3つの手順
https://engineer.evisu0414.com/mysql001/


## 【遭遇率第1位】
### Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

原因：
ざっくり言うと***mysql.sockファイルが存在しないから作ってね***
解決策：
***/tmp直下にmysql.sockを作る***

```terminal
mysql.sockファイルがあるか確認
~ $cd /tmp
tmp $ ls
mysql.sockがない

tmp $ sudo touch mysql.sock
tmp $ cd
~ $ sudo mysql.server start
ERROR!~~~

startできずエラー発生したら
権限の書き換え（chownでファイルやディレクトリの所有者と所属グループを変更する）
~ $ sudo chown username /tmp/mysql.sock
もしくは権限付与
~ $ sudo chmod 777 /tmp/mysql.sock

もう一度mysql起動
~ $ sudo mysql.server start
...SUCCESS!
```
mysql.sockファイルの作り方は色々あると思いますが、私はこのエラーが起きた時は`touch`コマンドで`/tmp/`ファイル直下に`mysql.sock`ファイルを直接作ってしまいます。socketファイル作成しても権限がないと怒られる事もあるのでその時は`chown`コマンドか`chmod`コマンドで権限の書き換えか権限付与してあげて下さい。

## 【遭遇率第2位】
### Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)

原因：
ざっくり言うと***pidファイルが存在しないから作ってね***
解決策：
***/usr/local/var/mysql/直下にlocal.pidファイルを作る***

```terminal

~ $ sudo mysql.server start
Starting MySQL
… ERROR! server quit updating PID file(/usr/local/var/mysql/usernoMacBook-ea.local.pid)

pidファイルがあるか確認してみる
~ $ cd /usr/local/var/mysql
mysql $ ls
usernoMacBook-ea.local.pidがない

mysql $ sudo touch usernoMacBook-ea.local.pid
mysql $ cd
~ $ sudo mysql.server start
...ERROR!~~/usr/local/var/mysql/username.local.err: Permission denied
権限ないよと怒られたら先ほどのエラーと同様に権限の書き換え（chownでファイルやディレクトリの所有者と所属グループを変更する）
~ $ sudo chown /usr/local/var/mysql/usernoMacBook-ea.local.pid
もしくは権限付与
~ $ sudo chmod 777 /usr/local/var/mysql/usernoMacBook-ea.local.pid

もう一度起動してみる
~ $ sudo mysql.server start
...SUCCESS!
```
先ほどと同様にやり方は色々あると思いますが、`pid`ファイルも`touch`コマンドで作ってあげましょう。`mysql.sock`のエラーと同様に権限ないよって怒られたら権限の書き換えか権限付与してあげましょう。

### ここまでのまとめ

ここまで紹介した`mysql.sock`ないよ、`~.local.pid`ないよ、`権限`ないよ、がMySQL関連エラーの大半を占めていると思います。「/tmpディレクトリってどこ！？」とか「/usrディレクトリなんて知らないよ」って最初は思いましたが、まずはファイルが無い事を確認する為に`cd`コマンドで該当ディレクトリまで潜って見てみましょう。

## 【遭遇率第3位】

### mysql立ち上がった！と思ったらsafeモードのプロセスが既に存在してますよっていうエラー

原因:
***既にMySQLのプロセスが動いている***
解決法:
***processをkillする***

```terminal
~ $ sudo mysql.server start
Starting MySQL
 SUCCESS! 
~ $ 200315 13:51:58 mysqld_safe A mysqld process already exists

動いているMySQLプロセスを確認してみる
~ $ ps aux| grep mysqld
user       98762  0.0 0.0 4268296  672 s004 S+  2:00PM  0:00.01 grep mysqld
user       98633  0.0 5.4 4929884 450652  ?? S   1:51PM  0:00.46 /usr/local/opt/mysql@5.6/bin/mysqld --basedir=/usr/local/opt/mysql@5.6 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@5.6/lib/plugin --log-error=usernoMacBook-ea.local.err --pid-file= usernoMacBook-ea.local.pid
user       98536  0.0 0.0 4281052  1128  ?? S   1:51PM  0:00.03 /bin/sh /usr/local/opt/mysql@5.6/bin/mysqld_safe --datadir=/usr/local/var/mysql ←注目
mysqld_safeプロセスが動いている模様

プロセスをkillする
~ $ sudo kill -9 98536
Password:

一度mysqlを停止する
~ $ mysql.server stop
Shutting down MySQL
.. SUCCESS! 

もう一度MySQLを起動してみる
~ $ mysql.server start
Starting MySQL
. SUCCESS!
```
これはこの前初めて遭遇したエラーです。頻出エラーより遭遇確率は低いと感じますが、`grep`して`mysql_safe`のプロセスが動いているか確認しましょう。`mysql_safe`以外のプロセスをkillしてもエラー解消しなかったので悪さしているmysql_safeを見つけてあげましょう。

## 【番外編】

### 過去に一度でも5.7を起動してしまうと、同じデータを使って5.6を起動すると今までの方法では解決できない場合がある。

この状況は過去に一度dockerでMySQL@5.7で起動した後に開発環境のMySQL@5.6を起動した時に起きた事があります。

この状況になったらMySQLを***アンインストール***する方法があります。ただし、開発環境で大切なデータがDBに残っている場合は何らかの方法で退避させてあげて下さい（退避方法は割愛します。実践した事ないです）。私は幸いにも開発環境に貴重なデータはないので躊躇無くアンインストールしました。


```
mysqlをアンインストールします
~ $ brew remove mysql
~ $ brew cleanup
以下のディレクトリ下にはmysql関連ファイルが作成されているので念の為、綺麗に削除しておきます
~ $ sudo rm -rf /usr/local/mysql
~ $ sudo rm -rf /Library/StartupItems/MYSQL
~ $ sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
~ $ sudo rm -rf /Library/Receipts/mysql-.pkg
~ $ sudo rm -rf /usr/local/Cellar/mysql*
~ $ sudo rm -rf /usr/local/bin/mysql*
~ $ sudo rm -rf /usr/local/var/mysql*
~ $ sudo rm -rf /usr/local/etc/my.cnf
~ $ sudo rm -rf /usr/local/share/mysql*
~ $ sudo rm -rf /usr/local/opt/mysql*

最後にver5.6をインストール
~ $ brew install mysql@5.6

インストールが完了したらパス通す
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile

.bash_profileの変更を反映
$ source ~/.bash_profile

MySQLを起動
~ $ sudo mysql.server start
. SUCCESS!
```
アンインストールしても過去のmysqlファイルがなぜか残っている場合があるので面倒ですけど `rm`コマンドで該当該当ファイルを削除してあげます。完全にクリーンになったMySQLならちゃんと起動してくれます。

## 【番外編2】
### rails new project-name -d mysql→ Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (LoadError)

原因:
***mysqlのライブラリーがロードできませんよ***
対策:
***mysql2をアンインストールしてbundle install***

```
project-name $ bundle exec gem uninstall mysql2
project-name $ bundle install
.
..
...
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4/ext/mysql2
/Users/akito/.rbenv/versions/2.3.1/bin/ruby -r ./siteconf20160929-55293-192vx35.rb extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/5.7.14/lib
-----
creating Makefile

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/akito/git/media/vendor/bundle/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.4/mkmf.log

current directory: /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/akito/git/media/vendor/bundle/gems/mysql2-0.4.4 for inspection.
Results logged to
/Users/akito/git/media/vendor/bundle/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.4/gem_make.out

An error occurred while installing mysql2 (0.4.4), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.4'` succeeds before bundling.

盛大に怒られている...
```
以下の参考記事の通りにやってみます
> RailsプロジェクトでMySQLがbundle installできなかった
https://qiita.com/akito19/items/e1dc54f907987e688cc0

```
project-name $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
project-name $ bundle install 
.
..
...
Bundle complete! 18 Gemfile dependencies, 78 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
     run bundle exec spring binstub --all
* bin/rake: Spring inserted
* bin/rails: Spring inserted
正常にbundle install完了したみたい

project-name $ rails db:create
Created database ‘project-name_development’
Created database ‘ project-name_test’
project-name $ rails db:migrate
project-name $ rails s
=> Booting Puma
=> Rails 5.2.4.1 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.4 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
きたきたきたーーーー！！！！
```
localhost:3000にアクセスすればいつものrails初期画面が表示されます。MySQLエラーのドツボにハマってrails sでサーバ起動できた時は快感ですね。

## 【番外編3】

```rails new``` すると

```terminal
Fetching mysql2 0.5.3
Installing mysql2 0.5.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/Users/sugawarakouhei/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3/ext/mysql2
/Users/sugawarakouhei/.rbenv/versions/2.6.6/bin/ruby -I
/Users/sugawarakouhei/.rbenv/versions/2.6.6/lib/ruby/2.6.0 -r ./siteconf20200913-76471-1vhwnwi.rb
extconf.rb --with-ldflags\=-L/usr/local/opt/openssl/lib\
--with-cppflags\=-I/usr/local/opt/openssl/include
checking for rb_absint_size()... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/USER_NAME/.rbenv/versions/2.6.6/bin/$(RUBY_BASE_NAME)
/Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:467:in `try_do': The compiler
failed to generate an executable file. (RuntimeError)
You have to install development tools first.
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:552:in `try_link0'
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:570:in `try_link'
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:782:in `try_func'
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:1069:in `block in have_func'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:959:in `block in
checking_for'
from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:361:in `block (2 levels) in
postpone'
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:331:in `open'
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:361:in `block in postpone'
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:331:in `open'
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:357:in `postpone'
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:958:in `checking_for'
	from /Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/2.6.0/mkmf.rb:1068:in `have_func'
	from extconf.rb:25:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

/Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mysql2-0.5.3/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in
/Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/mysql2-0.5.3 for inspection.
Results logged to
/Users/USER_NAME/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-19/2.6.0/mysql2-0.5.3/gem_make.out

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before
bundling.

In Gemfile:
  mysql2
```

こちらの記事を参考に

Rails error installing mysql2 (mysql2-0.3.20)
> https://stackoverflow.com/questions/51228905/rails-error-installing-mysql2-mysql2-0-3-20

mysql2インストールにはまった
> https://qiita.com/rainbow___0/items/b290c1a5d86a8b86f65e

```terminal
$ brew install mysql
Updating Homebrew...
Warning: mysql 8.0.21_1 is already installed and up-to-date
To reinstall 8.0.21_1, run `brew reinstall mysql`
```

```terminal
$ gem install mysql2 -v '0.5.3' -- --srcdir=/usr/local/mysql/include
Building native extensions with: '--srcdir=/usr/local/mysql/include'
This could take a while...
Successfully installed mysql2-0.5.3
Parsing documentation for mysql2-0.5.3
Installing ri documentation for mysql2-0.5.3
Done installing documentation for mysql2 after 0 seconds
1 gem installed
```

```terminal
$ bundle install
```

## 【忘れがちなコマンド覚書き】

##### sudo mysql.server start
→MySQLを立ち上げます
##### sudo mysql.server stop
→MySQLを停止します
##### sudo mysql.server restart
→MySQLをstop&startします
##### sudo mysql.server status
→MySQLの状態を確認します
##### ps aux| grep mysqld
→MySQLのプロセスを探します


## まとめ
以上、私が遭遇したMySQLエラーのまとめでした。自分で何度も遭遇して解決しているうちに遭遇するパターンが同じだったので一覧で見れるようにしておけば後から振り返る時に便利だなと思い久々にQiitaを書いてみました。今回は初めてipadでこの記事を全部書いてみましたが、以外と快適に書けたのでipadとsmart keybord買った甲斐がありました。

#### 終わり