Mysql2::Error::ConnectionErrorへの対処方法
RailsプロジェクトをRails_newで作成した後、開発環境にデータベースを生成しようと試みた際のエラーいついて、原因と対処法を、こちらに備忘録としてまとめておきます。
エラー内容1
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Couldn't create '*****_*****_development' database. Please check your configuration.
rails aborted!
日本語翻訳
ソケット「/tmp/mysql.sock」経由でローカルMySQLサーバーに接続できません (2)。
「*****_*****_development」データベースを作成できませんでした。設定を確認してください。
Railsが中止されました!
エラー内容2
Caused by:
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
日本語翻訳
Mysql2::Error::ConnectionError:のせいで:
ソケット '/tmp/mysql.sock' を介して、
ローカルMySQLサーバーに接続できません (2)
エラー発生までの経緯
- Ruby on Railsでアプリケーションを作成中
- Ruby、Railsをインストール
- Rails newコマンドを実行後、
- $ bundle exec rails db:createを実行したタイミングでエラーが発生した。
対処をしていく流れを記録
-
/tmp/mysql.sockというファイルがあるか確認->なかった - このファイルが存在しないことが原因かな?
/tmp/mysql.sockって何? ChatGPTの回答
-
/tmp/mysql.sockは、MySQLがローカル接続用に使用するUNIXソケットファイルのデフォルトのパス。 -
UNIXソケットは、同じマシン上のプロセス間でデータをやり取りするための通信手段だ。この場合、RubyのプログラムがMySQLのデータベースと通信するために使用する。 - ただし、これはあくまでファイルパスであって、
コードの一部ではない。 - この
パスが指定されている場所や、それがどのように使われているかによって、その扱い方や意味が変わる可能性がある。
/tmp/mysql.sockが存在するかを確認する。
$ mysql_config --socket # MySQLで設定されているSocketのパスを確認するコマンド
# #/tmp/mysql.sock ->これは良さそう。
$ ls -la /tmp/mysql.sock # /tmp/mysql.sockが対象のディレクトリ配下に存在するか確認するコマンド
# # ls: /tmp/mysql.sock: No such file or directory
/tmp/mysql.sockをとりあえず作成する。
$ cd ~/対象のディレクトリパス #対象のアプリディレクトリに移動してから、、、
$ touch /tmp/mysql.sock # /tmp/mysql.sockを作成する。
$ ls -la /tmp/mysql.sock # ->一応できたっぽい?
## -rw-r--r-- 1 ****** wheel 0 9 1 09:49 /tmp/mysql.sock
-
-rw-r--r--は、所有者のパーミッション、グループのパーミッション、他人のパーミッションといったものを示している。 -
rは読み出しwは書き込みを示している。
もう一度$ bundle exec rails db:createを実行してみる。
$ bundle exec rails db:create
またエラーになってしまうが、エラー内容は少し変わった。
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
Couldn't create '****_****_development' database. Please check your configuration.
エラーが(2)から38)に変わっただけだが、これはなんなのだろう?
config/database.yml内で socketの指定先が違っている可能性
とりあえず、database.ymlの中身を確認してみる。
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
host: localhost
socket: /tmp/mysql.sock # ここがなかったので追記してみた。
もう一度bundle exec rails db:createを実行してみる。
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
Couldn't create '****_****_development' database. Please check your configuration.
エラーは変わらず、、、、
可能性:MySQLサーバーを起動しないと、接続ができないということかもしれない。
- どうやら、自身で、以前にも同じような内容でハマっていたことがあったようだ。
- mysqlサーバーを起動すれば、
/tmp/mysql.sockが自動で生成されるらしい。 - 以下コマンドを試してみる。
$ mysql.server start
-> Starting MySQL
SUCCESS!
- 一旦、先ほど、指定した
database.ymlのsocket: /tmp/mysql.sockという追記した部分は削除して、元に戻した。 - その上で、再度
$ bundle exec rails db:createを実行してみる。
Created database 'app_name_development'
Created database 'app_name_test'
- データベース作成できました!
- Railsサーバーも立ち上がりました!
まとめ
-
MySQLでデータベースを作成する場合は、MySQLサーバーを起動していないとできない。 -
$ mysql.server startでMySQLサーバーを起動してから、$ bundle exec rails db:createを実行する。
参考サイト