記事の目的
rails db:migrateやrails sをするも以下のようなエラーが出て、解決に時間がかかってしまいました😭
必要な経過だけ記事で共有させて頂き、誰かのお役に立てれば幸いです。
Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: YES)
##Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: YES)はどういう時にエラーが出る?(結論:rootユーザのパスワードが正しくない)[現状把握①]
このエラーが何なのかしっかり言及している記事が見当たらなかったのですが、公式のリファレンスや英文の記事で把握できました。(using password: NOの場合の記事は多くあった気がする。。)
公式リファレンス(以下URL参照)には、「誤ったroot パスワードを使用していることを示しています。」と書かれている。
また、英文の記事(以下URL参照)には、「rootユーザがデータベースにアクセスするのに十分な権限を持っていない」「rootユーザのパスワードが正しくない」「rootユーザのパスワードが設定されていない」「rootユーザが十分な権限を持っていない」のいずれかと書かれています。
私の場合のエラーの原因の結論としては、
両方で言及されている「rootユーザのパスワードが正しくない」のが正解でした。
MySQLリファレンスマニュアル:https://dev.mysql.com/doc/refman/5.6/ja/access-denied.html
英文のページ:https://www.yawintutor.com/access-denied-for-user-root-localhost/
(調べたら、インドのプログラミングスクールの記事みたいです。会社の要求スキルと求職者のギャップを埋める為に運営してるそう。笑)
##rootユーザのパスワードが正しくないのかを確認する[現状把握②]
MySQLのrootユーザーのパスワードの確認の為に、どのパスワードでログインできるかを確認します。
自身は、bash.profileに記載したパスワードをMySQLにおいても設定していると思いこんでいた為、確認しておらず時間がかかってしまいました。(ここで、パスワードが正しくないことに気づく。。)
$ mysql -u root -p
Enter password: ←(bash.profile記載のパスワードを入力するも入れない、、)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
空欄を入れてみると、ログインできたのでrootユーザーのパスワードは「空欄」であることの確認がとれました。
$ mysql -u root -p
Enter password: ←(パスワードを空欄にすると入れた!)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 5.7.32 Homebrew
##解決策(結論:MySQLのパスワードとbash.profile記載のパスワードを一致させる)
database.ymlは、データベースと接続する為の設定ファイルです。
ここに書かれているユーザ名とパスワードを利用してRailsからMySQLにアクセスしますので、ここをMySQLのパスワードと合わせます。
私の場合は、bash.profileに環境変数を定義して、database.ymlにて環境変数の呼出をすることでdatabase.ymlへのユーザ名とパスワードの直書きを避けていました。
bash.profileに間違って定義しているパスワードを削除し、MySQLに設定されているパスワードを記載します。(今回は空欄)。viコマンドでファイルを開き、インサートモード(i入力)にして編集して保存(:wq)します。
$ vi ~/.bash_profile
(viコマンドで表示される画面↓)
export PATH="~/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
alias =ls
export DB_USERNAME="root"
export DB_PASSWORD="" (←空欄に変更)
~
"~/.bash_profile" [readonly] 5L, 170C
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV["DB_USERNAME"] %>(←ここでbash.profileで定義してる環境変数を呼出している)
password: <%= ENV["DB_PASSWORD"] %>(←ここでbash.profileで定義してる環境変数を呼出している)
host: localhost
database.ymlに直にユーザ名とパスワードを書かれている方は、セキュリティ上よくないので
以下の記事でbash_profileに記述する方法、.envファイルに記述する方法が書かれているので、そちらに記載するといいかもしれません。環境ごとで異なる環境変数を持ちたいときは.envへの記述をするようですね。
これで、MySQLのユーザ名とパスワードとdatabase.ymlに記載しているユーザ名とパスワードが一致している状態となりました。
rails db:migrate及びrails sを再度実行してみます。(エラーは出ないはず、、、)
#rails db:migarate及びrails sを再度実行
実行する前に!!こちら忘れないで下さい。
以下のコマンドをせず、再度エラーが出てしまい「パスワードが違う以外の原因なのか?😥」と無駄に色々調べてしまいました。
$ source ~/.bash_profile
sourceコマンドは、設定ファイルの変更を反映させるコマンドとなります。
.bash_profileの変更を反映していなかったから、引き続きエラーが出たのですね。
最後、実行します。
rails db:migrateを実行...できました!!
$ rails db:migrate
== 20201113061351 AddConfirmableToDevise: migrating ===========================
-- add_column(:users, :confirmation_token, :string)
-> 0.0814s
-- add_column(:users, :confirmed_at, :datetime)
-> 0.0514s
-- add_column(:users, :confirmation_sent_at, :datetime)
-> 0.0503s
-- add_column(:users, :unconfirmed_email, :string)
-> 0.0457s
== 20201113061351 AddConfirmableToDevise: migrated (0.2292s) ==================
rails sも実行...できました!!
$ rails s
=> Booting Puma
=> Rails 6.0.3.3 application starting in development
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.6 (ruby 2.6.3-p62), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:3000
* Listening on tcp://[::1]:3000
Use Ctrl-C to stop
めでたしめでたし。