【備忘録】Ruby on Rails でMySQLを使用した際に起きた「認証エラー」解決法

はじめに

現在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

#temp_developmentは自分の環境では無かったので、とりあえずデフォルトであったmysqlに変更しました


結果

上記の変更をした上で改めて、http://localhost:3000に接続をすると次のようになり、きちんと接続が出来るようになりました。

0 件のコメント :

コメントを投稿