0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at
1 / 2

##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のことなどさっぱりわかりませんので、情報の正確性はありませんので、参考程度にみていただけたら嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?