20200824のMySQLに関する記事は7件です。

operator does not exist: timestamp without time zone ~~ unknownというエラーの対処

環境

・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15
・herokuへデプロイ

あらすじ

railsでWebアプリを作成しherokuへデプロイするときにエラーが発生した。

heroku log でエラーを確認すると以下のような表示を発見

operator does not exist: timestamp without time zone ~~ unknown

エラー文は初めはよくわからなかったがtimestampとはカラムの型なので型のところで何かエラーが起こっていることがわかりさらに調べて見ました。

そうするとDBの検索の条件文に問題点があることが判明。
もうすこし詳しくいうと、データの作成日時で検索をかけていたロジックが以下みたいに文字列(string型)で検索していたため問題が発生。

where('created_at: LIKE(?)', "%%-%%-%%") #左記は問題のコード

原因

原因は端的にいえばherokuのDBは『PostgreSQL』であり自分の環境(MySQL)と異なっていたことです。
『MySQL』ではtimestamp型のカラムをstring型で検索しても自動で変換してくれる(寛容)みたいです。
『PostgreSQL』ではSQL文を厳密にしないと動作しないみたいです。(厳しい・・・)

対策

xxx.in_time_zone.というメソッドを使うことで解決しました!
例えば自分の場合は月単位でデータを取りたくて2020年8月のデータを取得したい場合(以下)

search_time = "2020-08-01"
(モデル名).where(created_at: search_time.in_time_zone.all_month)

とすることでうまくtimestamp型でデータ検索ができるので『PostgreSQL』でもうまく動きました!
また記述も少なくなりスッキリしました!
最後のall_monthをall_dayなどに変更可能でかなり使えます!詳しくはリンクがあるのでそちらがとてもわかりやすく書いてあります!

参照

エラー文について
https://nobuneko.com/blog/archives/2010/05/postgresql83operator_does_not.html
TimeクラスとDateTimeクラスについて
https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベース(MySQL)の主キーを任意のカラムに変更する。

初めに…

データベースでテーブルを作成すると必ず作成される主キー( :id カラム)ですが、デフォルトではレコードに登録された順番に1番から登録されていきます。ところが、既存のサービスを見てみると https://www.uniqlo.com/jp/ja/products/E428313-000 のように商品番号が URL に入っていたり、ユーザー情報を閲覧できるページではユーザー名がパラメータとなっていたりします。
そこで、本投稿ではデータベース(MySQL)で主キーを任意のカラムに変更する方法をご紹介します。

データベース (MySQL) の主キーを任意のカラムに変更する方法

db/migrate/_マイグレーションファイル.rb
class    < ActiveRecord::Migration[5.2]
  def change
    create_table :テーブル名, id: false, primary_key: :主キーにするカラム名 do |t|
      # `id: false` は、このテーブルでは `:id` カラムを作成しない。という記述です。
      # `primary_key:` に主キーにするカラム名を指定する。
      t.timestamps
    end
  end
end
app/models/モデル名.rb
class モデル名 < ApplicationRecord
  self.primary_key = "主キーにするカラム名"
    # モデルファイルに この記述をすることで主キー(プライマリーキー)となるカラムを指定する。
end
  • モデルファイルに主キーとなるカラムを記述しておくことで、コントローラーから モデル名.find(params[:id]) により :id のレコードを呼び出すと…
サーバーログ
Parameters: {"id"=>"値"}
SELECT  `テーブル名`.* FROM `テーブル名` WHERE `テーブル名`.`主キーとするカラム名` =  LIMIT 1`

となり、ちゃんと主キーとした値が読み込まれてることが分かります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]rails db:migrateを実行した際に発生したエラー

状況説明

ターミナル.
$ rails db:migrate

上記のコードを実行した際に下記エラーが発生。

ターミナル.
== 20200823050614 DeviseCreateUsers: migrating ================================
-- create_table(:users)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `nickname` varchar(255) NOT NULL, `email` varchar(255) DEFAULT '' NOT NULL, `pass` varchar(255) NOT NULL, `confirmation_pass` varchar(255) DEFAULT '' NOT NULL, `family_name` varchar(255) NOT NULL, `family_name_kana` varchar(255) NOT NULL, `first_name` varchar(255) NOT NULL, `first_name_kana` varchar(255) NOT NULL, `birth_year` int NOT NULL, `birth_month` int NOT NULL, `birth_day` int NOT NULL, `icon` varchar(255), `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL)
/Users/sasakiken/projects/furima_app/db/migrate/20200823050614_devise_create_users.rb:5:in `change'
/Users/sasakiken/projects/furima_app/bin/rails:9:in `<top (required)>'
/Users/sasakiken/projects/furima_app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

Caused by:
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `nickname` varchar(255) NOT NULL, `email` varchar(255) DEFAULT '' NOT NULL, `pass` varchar(255) NOT NULL, `confirmation_pass` varchar(255) DEFAULT '' NOT NULL, `family_name` varchar(255) NOT NULL, `family_name_kana` varchar(255) NOT NULL, `first_name` varchar(255) NOT NULL, `first_name_kana` varchar(255) NOT NULL, `birth_year` int NOT NULL, `birth_month` int NOT NULL, `birth_day` int NOT NULL, `icon` varchar(255), `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL)
/Users/sasakiken/projects/furima_app/db/migrate/20200823050614_devise_create_users.rb:5:in `change'
/Users/sasakiken/projects/furima_app/bin/rails:9:in `<top (required)>'
/Users/sasakiken/projects/furima_app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

Caused by:
Mysql2::Error: Table 'users' already exists
/Users/sasakiken/projects/furima_app/db/migrate/20200823050614_devise_create_users.rb:5:in `change'
/Users/sasakiken/projects/furima_app/bin/rails:9:in `<top (required)>'
/Users/sasakiken/projects/furima_app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

エラー内容

Table 'users' already exists: CREATE TABLEusers``の箇所を翻訳すると、usersテーブルは既に存在しますと言った内容。

作成した覚えはないが、存在していると言うことなので下記コードで一度確認。

ターミナル.
$ rails db:migrate:status

すると以下のように...

ターミナル.
database: furima_app_development

 Status   Migration ID    Migration Name
--------------------------------------------------
  up     000             ********** NO FILE **********
  down    20200823050614  Devise create users

どうやらup 000 ********** NO FILE **********が悪さをしていたようですね。

エラー原因

マイグレーションファイルをコマンドで削除せずに、手動で削除したことが原因のようで、マイグレーションファイルの操作は必ずコマンドで行わなければならないと言うことでした...。(初歩的だけど一度はやってしまいがち?)

エラー対処法

ステータスがupとなっているところをdownにしなければいけないので、そのためのマイグレーションファイルをdb/migrate配下に作成。

NO FILEとなっているマイグレーションIDのファイルが必要なので、000_dummy.rbとし、以下のようにコード記述。

db/migrate/000_dummy.rb
class Dummy < ActiveRecord::Migration[5.2]
  def change
  end
end

この状態でもう一度、rails db:migrate:statusを実行すると、以下のように作成したマイグレーションファイルが確認できる。

ターミナル.
database: furima_app_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     000             Dummy
  down    20200823050614  Devise create users

続いて、次のコマンドでdownにします。(マイグレーションIDはご自身のものを指定)

ターミナル.
$ rails db:migrate:down VERSION=000

再びrails db:migrate:statusを実行すると、downに変更されているはずですので、後はDummyファイルを削除すれば解決!

改めてrails db:migrateを実行すればテーブルを作成できると思います。

最後に

今回の発信で50記事達成!
この調子で継続していきますので今後も宜しくお願いします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL5.6から5.7にアップグレードする手順

はじめに

初心者の備忘として。
Laravel×MySQLで学習を進めていると、結構最初の段階でエラーが出て進めなくなった。調べてみたところMySQLのアップグレードで解消できる模様。アップグレードがてら、今後の参考にしようということでまとめてみます。

■参考になる(かもしれない)人
・MySQL5.6から5.7にアップグレードしたい人
・ドットインストールのローカル開発環境の構築 [macOS版]のレッスンでMySQLをインストールした人(MySQLを、MacでYumリポジトリを使ってインストールした人)

【困った① いろいろなやり方があったけど…】

アップグレードについて調べていると、いろいろな方法が。この記事(Qiita)とかこの記事(企業発信)はサーバーの停止とかMySQLの削除とかしているからそれは必須?違う箇所があるけどどっちが正しい?どれをやっても同じ?

調べても調べてもわからないので、初めてMySQLの公式ドキュメントをみてみることに。

アップグレード手順は、プラットフォームと初期インストールの実行方法によって異なります。現在のMySQLインストールに適用される手順を使用します。

  • Windows以外のプラットフォームでのバイナリおよびパッケージベースのインストール…
  • MySQL Yumリポジトリを使用したEnterprise LinuxプラットフォームまたはFedoraへのインストール…
  • MySQL APTリポジトリを使用したUbuntuへのインストール…
  • MySQL SLESリポジトリを使用したSLESへのインストール…
  • Dockerを使用して実行されるインストール…
  • Windowsでのインストール…

・・・なるほど。初期インストールの実行方法によってアップグレードの方法は異なるのか。しかも現在インストールされているバージョンによっても変わってくる模様。だからいろいろな方法が紹介されているのか!
ここで新たな問題が。

【困った② どうやってMySQLをインストールしたのか覚えていない…】

初期インストールの実行方法によってアップグレードする方法が違うのはわかったけど…どうやってインストールしたっけ?
ドットインストールの「ローカル開発環境の構築 [macOS版]」を進めていたら、いつの間にかPHPとかMySQLが使えるようになっていたな(確か)、と思い出しもう一度動画をおさらい。
仮想マシンの設定をしよう(#7)でgitをインストールし、gitを使ってアプリケーション設定用のスクリプトをDL・実行していた。その中でphpやMySQLが、yum を使ってインストールされていた。つまりMacユーザでドットインストールでローカル開発環境を整えた場合、MySQL Yumリポジトリを使用している模様。
同じ状況の人がいれば(いるのかな?)、これ以降の記事が参考になると思います(多分)。

【環境】
・Mac
・CentOS 6.8
・ローカル開発環境(Vagrant,virtualbox)

【困った③ じゃあどうやればいいの?】

MySQL Yumリポジトリを使用したMySQLのアップグレードをとりあえず読んでみた。箇条書きにしてみます。

  • デフォで、自動で現在のリリースシリーズの最新バージョンにしてくれる(例えば、5.6.xの「.x」シリーズは自動的に更新される。5.7には更新されない。)
  • 5.6から5.7に更新するには、5.6のサブリポジトリを無効にし、5.7のサブリポジトリを有効にする必要がある。
  • 上の設定をした後、MySQLのアップグレードを行う

なるほど。なんとなくわかった(気がする)。

STEP 0. yumのユーティリティツールをインストール(必要?)

後でインストールするMySQLのバージョンを5.7にするために5.6を無効化したりするのに利用するらしいから、上記で触れたドキュメントには記載がなかったけど実行してみた。「インストールしています」とかいろいろ表示されたから、必要だったのかな??(誰か教えてください)
【余談】そもそもyumって何??

[vagrant@localhost ~]$ sudo yum -y install yum-utils

STEP 1. サブリポジトリの有効/無効の確認

MySQL Yumリポジトリ内のサブリポジトリを下記のコマンドで全て表示し、それぞれの有効・無効の確認をする。
ふむふむ、mysql56-communityは有効で、mysql57-community-・・・は無効になっている(だからバージョンが5.6なのかな?)。

[vagrant@localhost ~]$  yum repolist all | grep mysql
mysql-connectors-community        MySQL Connectors Community        有効:    137
mysql-connectors-community-source MySQL Connectors Community - Sour 無効
mysql-tools-community             MySQL Tools Community             有効:     93
mysql-tools-community-source      MySQL Tools Community - Source    無効
mysql55-community                 MySQL 5.5 Community Server        無効
mysql55-community-source          MySQL 5.5 Community Server - Sour 無効
mysql56-community                 MySQL 5.6 Community Server        有効:    606
mysql56-community-source          MySQL 5.6 Community Server - Sour 無効
mysql57-community-dmr             MySQL 5.7 Community Server Develo 無効
mysql57-community-dmr-source      MySQL 5.7 Community Server Develo 無効

STEP 2. サブリポジトリの5.6の無効化・5.7の有効化

MySQL 5.6シリーズのサブリポジトリを無効にして、MySQL 5.7シリーズのサブリポジトリを有効にする(ドキュメントの説明はちょっとややこしかった)。

[vagrant@localhost ~]$ sudo yum-config-manager --disable mysql56-community
[vagrant@localhost ~]$ sudo yum-config-manager --enable mysql57-community-dmr

ちなみに、sudo yum-config-manager --enable mysql57-community
と実行しても、読み込んだプラグイン:fastestmirrorとだけ表示されて有効に変わらなかったので、他の記事も参考に-dmrをつけて実行したところ、ちゃんと有効に変わった。

STEP 3. MySQLのアップグレード

[vagrant@localhost ~]$ sudo yum update mysql-server  //dnfが有効でない場合

※dnf有効の場合、sudo dnf upgrade mysql-server
【余談】・・・dnfって何??

STEP 4. 確認

ちゃんとMySQL5.7になっているか確認。

[vagrant@localhost ~]$ mysql --version
mysql  Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using  EditLine wrapper

参考

Windows以外のプラットフォームでのバイナリおよびパッケージベースのインストールについて
MySQL Yumリポジトリを使用したEnterprise LinuxプラットフォームまたはFedoraへのインストールについて
MySQL APTリポジトリを使用したUbuntuへのインストールについて
MySQL SLESリポジトリを使用したSLESへのインストールについて
Dockerを使用して実行されるインストール
Windowsでのインストールについて

【余談】

■そもそもyumって何??

  • yumは、Red Hat系のLinuxディストリビューションで使われている“RPMパッケージ”を扱うためのパッケージ管理コマンド。
  • yumコマンドの書式: yum [オプション] コマンド [パッケージ名など] (例)yum install[update/erase] パッケージ名

参考リンク

■・・・dnfって何??

DNFまたはDandified Yum (ダンディファイド ヤム)は、RPMベースのパッケージ管理システムを採用しているLinuxディストリビューション用のパッケージマネージャであるYum 3.4のフォークであり、Yumの事実上の後継バージョン

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP掲示板に検索機能の実装

PHPで作成した掲示板に、検索機能を実装したので振り返りつつ。

参考にした記事はこちら。
https://www.sejuku.net/blog/104455

具体的な機能は、
名前を検索すると、それに紐づいたIDと発言内容を表示する
という形。

トップページに検索内容の入力フォーム→別ファイル検索機能(search.php)の作成
で行った。

検索内容の入力フォームの作成

TOPページにこんな感じで作成した。
実際に機能が動くのはsearch.php。
ここでは入力フォームで文字を受け取り、"search_name"という名前で受け取る。

index.php
<h2>検索</h2>
<form action="search.php" method="post">
    <!-- 任意の<input>要素入力欄などを用意する -->
    <input type="text" name="search_name">
    <!-- 送信ボタンを用意する -->
    <input type="submit" name="submit" value="名前を検索する">
</form>

検索機能の作成

検索機能に関して、DB接続の前半部と、検索されてきた文字を表示する後半部に分けて説明。

DBから任意のデータを検索する前半部。

search.php
<?php
try{
    //DBに接続
    $dsn = 'mysql:dbname=test_bbs2; host=localhost';
    $username= 'root';
    $password= 'root';
    $pdo = new PDO($dsn, $username, $password);

    //SQL文を実行して、結果を$stmtに代入する。
    $stmt = $pdo->prepare(" SELECT * FROM contacts WHERE  submit_name LIKE '%" . $_POST["search_name"] . "%' "); 

    //実行する
    $stmt->execute();
    echo "OK";
    echo "<br>";
} catch(PDOException $e){
    echo "失敗:" . $e->getMessage() . "\n";
    exit();
}
?>

DB接続に関しては割愛。
大事なのは

search.php
    $stmt = $pdo->prepare(" SELECT * FROM contacts WHERE  submit_name LIKE '%" . $_POST["search_name"] . "%' "); 

ここの部分。

" SELECT * FROM contacts WHERE  submit_name LIKE '%" . $_POST["search_name"] . "%' "

ここのSQL文で
・contactsテーブルから(FROM contacts)
・submit_nameの条件で(WHERE submit_name)
・$_POST["search_name"]を含む値を取得する

$_POST["search_name"]の前後の%や、LIKEがないと、
田中という名前があった時に、「田」一文字では田中をヒットできない。
「田中」という全部一致しないと検索されてこない、という状況が起こる。

%(ワイルドカード)の使い方の詳細については
https://qiita.com/ika_katsuo/items/40e7784284344c7d8697
こちらの記事を参考に。

LIKEによる検索はあいまい検索という。

DBから取得したデータを画面に表示する後半部。

DBから取り出したデータを、HTMLとPHPで記述して画面に表示する。
コードはこんな感じになっている。

search.php
<html>
    <body>
        <table>
            <tr><th>ID</th><th>Name</th><th>remark</th></tr>
            <!-- ここでPHPのforeachを使って結果をループさせる -->
            <?php foreach ($stmt as $row): ?>
            <tr>
                <td><?php echo $row[0]?></td>
                <td><?php echo $row[1]?></td>
                <td><?php echo $row[2]?></td>
            </tr>

                <?php endforeach; ?>
        </table>
    </body>
</html>

ここではhtmlで記述し、foreachでstmtのオブジェクトから値を取り出しています。

・$row[0]でIDを、

・$row[1]で名前を、

・$row[2]で投稿内容を

それぞれ表示します。

あとはテーブルの形になるようにtableタグが使われています。

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQL 認証プラグイン caching_sha2_password

はじめに

MySQLに接続できないエラーでハマったので対処法を備忘録としてまとめました。

エラー内容

認証プラグインがcaching_sha2_passwordとなっていることが原因だそうです。
そこで、まずはMySQLに接続して認証プラグインを確認します。

ターミナル
$ mysql -u root   //mysqlにrootで接続。rootにパスワードを設定している場合はオプションでパスワードを指定する

mysql> SELECT User, Host, Plugin FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

rootの認証プラグインがcaching_sha2_passwordになっています。

対策(caching_sha2_passwordをmysql_native_passwordに変更)

認証プラグインをcaching_sha2_passwordからmysql_native_passwordに変更します。
下記が変更するためのコマンドです。

ターミナル
mysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>';

User, Host, passwordの部分は置き換えてください。

私の場合はrootを変更したいので下記のようにしました。

ターミナル
mysql> ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY 'password';

変更できているか確認する

ターミナル
mysql> SELECT User, Host, Plugin FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |  <= 変更されている!
+------------------+-----------+-----------------------+

Dockerの場合

Dockerのコンテナ内で認証プラグインを変更する場合にはまずコンテナに入る必要があります。

ターミナル
$ docker ps       //DockerのCONTAINER IDを確認
$ docker exec -it <CONTAINER ID> bash     //確認したMySQLのCONTAINER IDを指定してコンテナに接続
# mysql -u root -p
Enter password: <database.ymlで設定したpassword>

mysql> SELECT User, Host, Plugin  FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| root             | %         | 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 |
+------------------+-----------+-----------------------+

mysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>' //rootの認証プラグインを変更

変更されているか確認↓

ターミナル
mysql> SELECT User, Host, Plugin  FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |  <= 変更されている!
+------------------+-----------+-----------------------+

コンテナを削除して、再度Buildすれば完了です。

ターミナル
$ docker-compose down
$ docker-compose build

終わりに

RailsとMySQLを使用しているとたまーにハマって抜け出せなくなるので、私みたいに時間を無駄にしてほしくないという思いも込めてまとめてみました。
みなさんの一助となれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLの認証プラグインを変更する方法(caching_sha2_password)

はじめに

MySQLに接続できないエラーでハマったので対処法を備忘録としてまとめました。

エラー内容

Plugin caching_sha2_password could not be loaded: /usr//usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

認証プラグインがcaching_sha2_passwordとなっていることが原因だそうです。
そこで、まずはMySQLに接続して認証プラグインを確認します。

ターミナル
$ mysql -u root   //mysqlにrootで接続。rootにパスワードを設定している場合はオプションでパスワードを指定する

mysql> SELECT User, Host, Plugin FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

rootの認証プラグインがcaching_sha2_passwordになっています。

対策(caching_sha2_passwordをmysql_native_passwordに変更)

認証プラグインをcaching_sha2_passwordからmysql_native_passwordに変更します。
下記が変更するためのコマンドです。

ターミナル
mysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>';

User, Host, passwordの部分は置き換えてください。

私の場合はrootを変更したいので下記のようにしました。

ターミナル
mysql> ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY 'password';

変更できているか確認する

ターミナル
mysql> SELECT User, Host, Plugin FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |  <= 変更されている!
+------------------+-----------+-----------------------+

Dockerの場合

Dockerのコンテナ内で認証プラグインを変更する場合にはまずコンテナに入る必要があります。

ターミナル
$ docker ps       //DockerのCONTAINER IDを確認
$ docker exec -it <CONTAINER ID> bash     //確認したMySQLのCONTAINER IDを指定してコンテナに接続
# mysql -u root -p
Enter password: <database.ymlで設定したpassword>

mysql> SELECT User, Host, Plugin  FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| root             | %         | 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 |
+------------------+-----------+-----------------------+

mysql> ALTER USER <User>@<Host> IDENTIFIED WITH mysql_native_password BY '<password>' //rootの認証プラグインを変更

変更されているか確認↓

ターミナル
mysql> SELECT User, Host, Plugin  FROM mysql.user;  //User, Host, Pluginを確認
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |  <= 変更されている!
+------------------+-----------+-----------------------+

コンテナを削除して、再度Buildすれば完了です。

ターミナル
$ docker-compose down
$ docker-compose build

終わりに

RailsとMySQLを使用しているとたまーにハマって抜け出せなくなるので、私みたいに時間を無駄にしてほしくないという思いも込めてまとめてみました。
みなさんの一助となれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む