AWSでデプロイしようとしたらMySQLが起動しない

##MySQLが起動しない
AWSでのデプロイとS3の紐付けのところで、1週間以上も苦戦した備忘録として書きました。
試行錯誤したコマンドなどを載せているだけですが、参考になれば幸いです。

流れとしては、自動デプロイができなくてエラーを調べたところ、unicornにエラーがある→MySQLにエラーがあったという流れです。

```
＄ mysql.server start
ERROR! The server quit without updating PID file (/usr/local/var/mysql/ooshibarikunarinoMacBook-Air.local.pid).
```
確認としてpsコマンドで確認

```
$ ps aux | grep mysql

rikuya0048        7650   0.0  0.0  4278520    684 s000  S+    2:57PM   0:00.00 grep mysql
```
grep mysqlでMySQLが起動しているといことか？

調べてみると、これはkillした方が良さそう

```
kill 7650
-bash: kill: (7650) - No such process
```

killできず。。

またエラー出ていたものの確認としてls/usr/local/var/mysqlの中身を確認

```
$ ls -la /usr/local/var/mysql
-rw-r--r--  1 _mysql  _mysql  0  3  9 19:06 /usr/local/var/mysql
```
他サイトを参照すると、ここにerrやpidファイルがあるはず。
もしかして/usr/local/var/mysqlの中身を
アンインストールする時に消してしまったかもしれない。

そもそもpidファイルがなさそうなので作成しようと思ったが、何度作ったり権限を与えようとしても解決せず。
3度目のアンインストール。

```
$ sudo rm -rf /usr/local/var/mysql
$ brew uninstall mysql@5.6
$ brew install mysql@5.6
```

deploy

```
＄ less log/unicorn.stderr.log
ERROR -- : Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Mysql2::Error::ConnectionError)
```
Can't connect to local MySQL server through socketのエラーは多いようで

```
$ mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
```
socketの場所がこっちだと/var/lib/mysql/mysql.sockになっている。
おかしい。

そもそもEC２サーバー上のMySQLの起動状況を確認すると

```
$ service mysqld status
mysqld (pid  22574) is running...
```
と表示される。調べてみるとsocket(2)のエラーは
ソケットがないか、そもそもソケットはMySQLが起動されると自動で作成されるらしいのですが、そもそもMySQLが起動されてる状態だと、そのソケットが使われてしまってて、起動できないよって言われるらしいので、余分に起動しているMySQLがあるならkillしたいところ。

なので

```
$ ps aux | grep mysql
root     22360  0.0  0.2  11788  2796 ?        S    Mar08   0:00 /bin/sh /usr/libexec/mysql56/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysq.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql    22574  0.0 45.6 1328444 460608 ?      Sl   Mar08   0:42 /usr/libexec/mysql56/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql56/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
ec2-user 32481  0.0  0.2 110536  2152 pts/0    S+   07:50   0:00 grep --color=auto mysql
```
かなり起動している様子。現状rootとmysqlとec2-userの3つが起動してるらしいが、とりあえずmysqlを消してみる

```
$ kill 22574
-bash: kill: (22574) - 許可されていない操作です
$ sudo kill 22574
```
普通のkillでは許可がされなかったので、最高権限？であるsudoを用いてkillに成功
繋がるか試してみる

```
$ mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
```
まだ繋がりません、soketの指定は/var/libになってるので確認してみます。

```
$ ls -al /var/lib/mysql/
$ sudo touch /var/lib/mysql/mysql.sock
$ sudo chown mysql:mysql /var/lib/mysql
```
確認したところなかったので作成し、権限をmysqlに変更。
しかし権限が変更できずrootのまま。謎です。

そして再度接続できるか確認したところ

```
$ mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)
```
初めてみました。(13)になりました。どうやら権限のエラーらしいので、

```
$ chmod g+w /var/lib/mysql/mysql.sock
許可されていない操作です
$ chmod 777 /var/lib/mysql/mysql.sock
許可されていない操作です
```
権限変更するための権限変更はどうすればいいのだろう、と思考するもわからず。

よくわからないので一回起動してみたら、

```
$ sudo service mysqld start
Socket file /var/lib/mysql/mysql.sock exists.
The file /var/lib/mysql/mysql.sock is not a socket file, which is suspicious.
Please, remove /var/lib/mysql/mysql.sock manually to start the service.
```
となったので、消してくださいということですね。

```
$ sudo rm -rf /var/lib/mysql/mysql.sock
```
お、起動しました

これでローカル、EC2サーバー共にmysqlが起動できるようになりました。

そしてユニコーンの起動を確認すると

```
config_file=config/unicorn.rb would not be accessible in working_directory=/var/www/current (ArgumentError)
```
と出てくる訳です。エラーをぐぐると、どうもworking_directoryの記述がおかしそうです。

unicorn起動できない

mysqlにローカルで接続できていないとのことなので

```
$ mysql -u root -p
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```
権限がないみたいで、ログインできないです。

```
$ mysql.server stop
$ mysqld_safe --skip-grant-tables &
$ mysql -u root
```
一回とめて、権限をなくしてログインすることができました
参考
https://noarts.net/archives/1110

というかそもそも、ERROR -- : Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Mysql2::Error::ConnectionError)のエラーは/tmp/mysql.sockを使ってローカルサーバーにアクセスできないとのことですが、EC2サーバー上のソケットは/tmp/mysql.sockでしたっけ。もしかしたらdatabase.ymlのproduction環境のところには、socketの指定が

```
production:
  <<: *default
  database: apli_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```
このように/var/lib/mysql/mysql.sockとなっているので、ここが噛み合っていないのかもしれないので確認してみます。

```
$ ls ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock
$ ls /tmp/mysql.sock
/tmp/mysql.sock
$ mysql_config --socket
/var/lib/mysql/mysql.sock
```
lsコマンドで/varlibと/tmp/を調べてみたらどちらも存在する模様。database.ymlやconfingで調べた初期設定でEC２上の設定では/var/lib/mysql/mysql.sockの方が適用されているらしい。なので/tmp/mysql.sockを消せばいいのでは？

カリキュラムには

```
$ rails db:create RAILS_ENV=production
rails aborted!
NameError: undefined local variable or method `　' for #<Apli::Application:0x0000000006007db8>
/var/www/apli/config/environments/production.rb:91:in `block in <top (required)>'
....
$ rails db:migrate RAILS_ENV=production
```
こんな感じでエラーが出てしまいますね。うーん

あ、bundle exec cap production deployしたら直りました！かれこれS3のエラーから数えると1週間以上かかって解決したデプロイ。

##まとめ
苦戦したエラーはこちら
・ERROR! The server quit without updating PID file (/usr/local/var/mysql/ooshibarikunarinoMacBook-Air.local.pid).
・ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

MySQL起動時のpidに関するエラーは多いようなので、調べれば出てくるのですが、pidファイルを作成したり、権限を変更してみたり、もしくはMySQLをアンインストールしてみたり(自分はアンインストールしました)しましょう。

ちなみに自分の場合は、環境構築の際にHomeBrewを使ったので、アンインストールするときは、brew uninstall mysql@5.6（各自のバージョンで）　のコマンドを使いインストールするときもbrewを忘れないようにしましょう。

あと、brew uninstallだけではMySQL関連のファイルは完全に削除できないらしいので、その辺は調べてからやるように。

そしてCan't connect to local MySQL server through socket '/tmp/mysql.sock' (2)のエラーですが、こちらもかなりの解決策があるようで、結局これといった解決方法は不明でした。試したこととしては、上と同様にsocket作成、権限変更、mysqlに繋がるか、socketのディレクトリを確認、database.ymlの記述を確認といったところです。

ちなみにsocketはMySQL起動時に自動的に生成されるようなので、すでにMySQLが起動していて、二重で起動されている場合もあるそうです。その際は片方でsocketが使用されているので、プロセスを確認してkillしてみるのも有効かもしれません。

あとは権限はrootではなくmysqlになっているかなども確認しましたし、EC２サーバー上のMySQLとローカル上のMySQLの起動状況も確認し、mysql -u root -pで接続できなかった場合は777とかいうコマンドで、権限を無効？にして入ったりしました。

unicornのエラーログでは/tmp/mysql.socket(2)に接続できませんとしか書かれていないのですが、それぞれのMySQLを細かく調べることによって詳細なエラーが見えてくるようになりました。

長々と書きましたが、自分自身MySQLのことなどさっぱりわかりませんので、情報の正確性はありませんので、参考程度にみていただけたら嬉しいです。