##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になっている。
おかしい。
そもそもEC2サーバー上の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で調べた初期設定でEC2上の設定では/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になっているかなども確認しましたし、EC2サーバー上のMySQLとローカル上のMySQLの起動状況も確認し、mysql -u root -pで接続できなかった場合は777とかいうコマンドで、権限を無効?にして入ったりしました。
unicornのエラーログでは/tmp/mysql.socket(2)に接続できませんとしか書かれていないのですが、それぞれのMySQLを細かく調べることによって詳細なエラーが見えてくるようになりました。
長々と書きましたが、自分自身MySQLのことなどさっぱりわかりませんので、情報の正確性はありませんので、参考程度にみていただけたら嬉しいです。