はじめに
現在Ruby on Railsについて「たった1日で基本が身に付く! Ruby on Rails 超入門 」という本を読みながら勉強をしています。 RailsはデフォルトではSQliteを使用しているのですが、私の環境ではMySQLを使用すること考えています。 MySQLを用いて本の通りに行ったらエラーが起きてしまったので、エラーの原因と解決策をまとめます。 ちなみに実行環境は以下の通りです。OS:Windows10
Ruby:2.4.4
Rails:5.2.1
mysql:8.0.12
エラーが起きた状況とエラー内容
本ではまず初めにrailsアプリを作成しています。
railsアプリはコマンドプロンプトを開き、以下のコマンドを入力することで作成することが出来ます。
rails new アプリ名
このコマンドではデータベースとしてSQliteを使用してしまうので、MySQLに変更するために以下のようにオプションを付けます。
rails new アプリ名 -d mysql
きちんとmysqlになっているかconfigフォルダ内にあるdatabase.ymlを確認します。
このdatabase.yml内のadapterという項目がmysql2となっていれば、変更が出来ています。
次に作成したRailsアプリを起動します。これはデータベースの種類によらず、コマンドプロンプトに以下のコマンドを入力します。(ちなみに蛇足ではありますが、コマンドを入力する場所はRailsアプリのフォルダで行います。)
rails s
これを実行するとPumaと呼ばれるアプリケーションサーバーが起動されます。
この状態で
http://localhost:3000
にアクセスすると、Railsのデフォルトのトップページが表示されるはずなのですが、私の環境では以下のようなエラーメッセージが表示されてしまいました。
エラーメッセージ
Authentication plugin 'caching_sha2_password' cannot be loaded
で調べたところ、MySQLの認証形式が対応していなかったため、生じた問題のようでした。
解決策
認証形式の変更
私の実行環境MySQL(8.0.12)ではデフォルトの認証プラグインがcaching_sha2_passwordだったのですが、これがPumaの方で対応していない?ことが原因みたいです。
ちなみに各ユーザーの認証形式は以下のコマンドで確認することが出来ます。
私の環境で、このコマンドを実行すると次のようになりました。
ちなみに各ユーザーの認証形式は以下のコマンドで確認することが出来ます。
select user, host, plugin from user;
私の環境で、このコマンドを実行すると次のようになりました。
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
|(作成したユーザー)| localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
認証形式が「caching_sha2_password」となっていることが確認することが出来ます。
次に認証形式の変更を行います。今回は自分で作成したユーザー(root権限を付与してあります。)の認証形式を「mysql_native_password」
に変更します。変更するにはalterを用いて以下のコマンドで変更が出来ます。
ALTER USER ユーザー名 IDENTIFIED WITH mysql_native_password BY 'password';
後から気が付いたのですが、もしかしたらBY 'password'の部分は要らなかったかもしれないです(試していないので不明ですが...)
先ほどと同様に認証形式を確認してみると次のようになり、きちんと変更が出来ました。
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
|(作成したユーザー)| localhost | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
database.ymlの変更
ユーザーの認証形式が変更出来たら、次にconfigフォルダ内にあるdatabase.ymlの中身を変更します。デフォルトの状態では以下ようになっております。
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
host: localhost
development:
<<: *default
database: temp_development
・username
・password
・development内のdatabase
の3つです。
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: (作成したユーザー名)
password: (作成したユーザーのパスワード)
host: localhost
development:
<<: *default
database: mysql
0 件のコメント:
コメントを投稿