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

2018/08/16

Ruby プログラミング

はじめに

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

結果

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

自己紹介

はじめまして 社会人になってからバイクやプログラミングなどを始めました。 プログラミングや整備の記事を書いていますが、独学なので間違った情報が多いかもしれません。 間違っている情報や改善点がありましたらコメントしていただけると幸いです。

X(旧Twitter)

フォローお願いします!

QooQ