経緯など
Ruby / Rails で作られたとあるアプリをローカル環境で動かそうとした際、rails s するまでに躓いた(そもそもマイグレーションなどがエラー)ので、その時の内容についてメモしておく。
結論を言うと、MySQL内で利用する「テストユーザー情報が存在していない」ことが原因だった。
恥ずかしながらMySQLにユーザーを追加するなど、生まれてこの方やったことがなかったので、先輩に相談して「そのテストユーザー作った?」から解消にこぎつけることができた。
こんな私に優しく教えてくれた先輩には感謝しかない。ざす!
db:migrate を実行するも失敗
色々省略するが、マイグレーションを実行したがエラーが出ていた。なぜdenied されるんだ!と思いながらググりまくっていた。(今思えばtestuser が、denied されている〜というのも納得。。)
$ bundle exec rake db:migrate
ruby/2.6.0 isn't supported by this pry-doc version
rake aborted!
Mysql2::Error: Access denied for user 'testuser'@'localhost' (using password: YES)
〜省略〜
ユーザーの一覧を確認
※$ mysql -u root -p
+PW聞かれたら未入力のままEnter
によりMysqlの起動が必要。
mysql> select user, host from mysql.user;
database.yml の記載内容
ちなみにdatabase.yml の設定内容は以下の通り。一部抜粋。
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: testuser
password: testpassword
MySQLのバージョンを確認
これは解消法を進める際に確認した部分だが、ここに記載しておく。
$ mysqld --version
/usr/local/Cellar/mysql/8.0.18/bin/mysqld Ver 8.0.18 for osx10.14 on x86_64 (Homebrew)
解消法
ユーザーを追加するべし
今回、DBへの接続がdenied されている原因は「ユーザーが作成されていないこと」だったので、ユーザーを追加することで解消できた。
ただし、MySQLのバージョンによって操作するコマンドが若干異なるようなのでメモる。
※$ mysql -u root -p
+PW聞かれたら未入力のままEnter
によりMysqlの起動が必要。
MySQL5.7 まで
# ユーザーの作成
mysql> create user 'testuser'@'localhost' identified by 'testpassword';
# 権限の付与(ユーザー作成も兼ねているので、create user は省略可能)
mysql> grant all on *.* to 'testuser'@'localhost' identified by 'testpassword';
- all:権限付与以外、全ての操作を許可する。
- *.*:全DBへのアクセスを許可する。([適用対象のデータベース].[適用対象のテーブル])
- 'ユーザ名'@'ホスト名':左記項目の指定。ホスト名の代わりにIPアドレスやlocalhost も指定可能。
- identified by 'パスワード':任意のパスワードを設定。
MySQL8.0 以降
# ユーザーの作成
mysql> create user 'testuser'@'localhost' identified by 'testpassword';
# 権限の付与
mysql> grant all on *.* to 'testuser'@'localhost';
権限の付与を行う際、末尾に「with grant option」をつけることでGRANT権限(何でも出来る権限)を付与し、他のユーザに対して権限を付与することが可能となる。通常これは管理者用ユーザーにしか付与しない。
改めてmigrate (create)
$ bundle exec rake db:migrate
ruby/2.6.0 isn't supported by this pry-doc version
rake aborted!
ActiveRecord::NoDatabaseError: Unknown database 'es_development'
〜省略〜
実行してみたが、「DB無いよ」という事態に。(恥ずい。)
db:create をやってからmigrate 実行。
$ bundle exec rake db:create
Created database 'es_development'
Created database 'es_test'
〜省略〜
→create 完了。
$ bundle exec rake db:migrate
ruby/2.6.0 isn't supported by this pry-doc version
== 2018XXXXXXXXX CreateConstracts: migrating =================================
〜省略〜
== 2018XXXXXXXXX CreateConstracts: migrated (0.1449s) ========================
→migrate 完了。
その他エラーの解消
この状態でrails s
してみたものの、ここまで華麗にスルーしてきた下記エラーメッセージが表示されている状況。
ruby/2.6.0 isn't supported by this pry-doc version
〜省略〜
/home/money/.anyenv/envs/rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/puma-3.11.3/lib/puma/launcher.rb:130:in `initialize': No such file or directory @ rb_sysopen - /home/money/rails_projects/es_sample/tmp/pids/es_sample.pid (Errno::ENOENT)
※これについては先輩からのアドバイスにより、下記ファイルを修正することで解消できた。
pidfile "#{_home}/rails_projects/#{_proj_name}/tmp/pids/#{_proj_name}.pid" #修正前
pidfile "#{_home}/Desktop/rails_projects/#{_proj_name}/tmp/pids/#{_proj_name}.pid" #修正後
→該当ファイルを格納しているフォルダのパスに合わせて修正。
rails s
→起動できた。
おまけ
関連コマンドのメモ。
特定ユーザーの権限を確認
mysql> show grants for 'ユーザ名'@'ホスト名';