Help us understand the problem. What is going on with this article?

【初学者のつまずきを記録】RailsでのMySQL接続:mysql.sock問題

はじめに

RailsでのMySQL接続手順について、備忘録的にまとめようと思います。
作業自体はごく基本的な内容かと思いますが、
初学者である僕が実際につまずいたことを重点的に記載しました。
僕と同じ初学者の方のご参考の一助となればうれしいです。
後半部分ではつまずいた原因について検討してみました。

※僕自身は「RailsのDBを(初めから| |後から)MySQLに変更する」を参考にしながら進めました。

前準備:MySQLを指定してRailsアプリを作成

Railsの仕様上、データベースを指定しない場合は自動的にSQLiteとなる。

$ rails new アプリ名 -d mysql

作成されたconfig/database.ymlを確認。

config/database.yml
default: &default
  adapter: mysql2
          ()

確かにMySQLとなっていることを確認。

MySQLとの接続

手順通り接続を試みる。が、エラー発生。

$ mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

mysql.sockを通じての接続ができなかったとのこと。

調べてみると、mysql.sockファイル自体が存在しないことが問題らしい。
確かに、tmpフォルダ内を確認してみても存在しない。下記実行で作成。

$ sudo touch /tmp/mysql.sock

その上で接続を試みても同じようなエラー発生。

$ mysql -u root             
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)

そもそも、mysql.sockファイルとは何だろう?
調べてみると、サーバーとクライアントの間で通信を行う際の仲介役的な役割らしい。
ここで、MySQLサーバーを起動していないことに気づきました。
というかエラー分にもしっかり MySQL serverとありますね。

MySQLサーバーを起動。

$ mysql.server start
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxxx.pid).

PIDファイルがないとのお達し。
指定された場所に作成をする。

$ touch /usr/local/var/mysql/xxxx.pid

その上でサーバー起動を試みるも、、、

$ mysql.server start                            
Starting MySQL
.rm: /tmp/mysql.sock: Permission denied
2020-02-17T12:13:34.6NZ mysqld_safe Fatal error: Can't remove the socket file:
/tmp/mysql.sock.
Please remove the file manually
         (略)

別のエラーが発生。
mysql.sockを削除しろと??
ないと言うから作ったのに。

言われるがままに削除し、
どこか不本意な気持ちのまま再度サーバー起動。成功。

$ mysql.server start                            
Starting MySQL
. SUCCESS! 
$ mysql -u root                                 
Welcome to the MySQL monitor. 
      (略)
mysql> 

MySQLへの接続も成功したようだ。釈然としない。

成功した理由を考えてみた

調べてみると、mysql.sockはMySQLサーバー起動時に自動的に作成されるファイルであり、
手動で作成する類のものではないらしい。
つまり、一番始めに発生した下記エラーは、mysql.sockを作成していないことが問題ではなく、
Can't connect:つなげない状態」であったことが問題であったと思われる。

$ mysql -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

よって、mysql.sockがない状態でも、
PIDファイルを作成してサーバー起動を成功させることによって(=ここでmysql.sockが自動作成され)
MySQLへの接続も成功した、、、という理解でいいのだろうか。

では手動作成のmysql.sockは何が問題であったのか?

調べてみるとどうやら手動で作成したmysql.sockは権限に問題があるようだ。
検証のために再度手動でmysql.sockを作成し、
自動作成(サーバー起動時)されたmysql.sockと$ ls -lの出力を比較してみた。

#手動
-rw-r--r--  1 root            wheel   0  2 17 22:56 mysql.sock

#自動作成
srwxrwxrwx  1 xxxx(ユーザー名)  wheel   0  2 17 22:45 mysql.sock

なるほど違う。

手動で作成された方はrootユーザーのみが書き込みの権限を持っている。
書き込みの権限がないとうまくいかないので、(参考:MySQL の設定上の考慮事項)
rootユーザー以外での実行ができない状態となっている??

ならばと手動作成した上でrootユーザー権限でサーバー起動を試みてみる。

$ sudo mysql.server start   
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxxx.pid).

だめかー。

では手動作成したものを自動作成と同じ権限に変えてみる。
これでダメな理由はないはず。

$ sudo chmod 777 mysql.sock  #権限を変更
$ sudo chown xxxx(ユーザー名) mysql.sock  #所有者も変更
$ mysql.server start                            
Starting MySQL
. SUCCESS! 

成功した!

手動でmysql.sockを作成した場合でも
権限周りを調整することによりサーバー起動ができることの確認がとれました。

まとめ

解決方法を色々とググりながら進めましたが、
「まずはじっくりとエラー分を解釈すること」の大切さを痛感しました。
またlinux等の知識が不足しており、後半の検証部分は気持ちとしてしこりが残っております。
(rootユーザー権限でサーバー起動できなかったあたり等)
今後の課題にするようにしたいと思います。

はじめての記事投稿でしたが、思考を整理するとても良い機会となりました。
誤り・認識違い、アドバイス等ご指摘いただけましたらとてもありがたいです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした