MySQL 8.4 認証プラグイン mysql_native_password に関するエラーを解決

最終更新:2025-04-26 by Joe

MySQL 8.0 以降で、ログイン時の認証プラグイン (MySQL Authentication Plugin) のデフォルト「mysql_native_password」が「caching_sha2_password」に変更になりました。さらに、 MySQL 8.4 および、MySQL 9.0 以降では、旧認証「mysql_native_password」はもう利用すること自体ができなくなります。

例えばMacOSにおける、Homebrew 環境などでは、なにかのきっかけで 自動で MySQL バージョンが アップグレードされてしまったりすると、上記の理由から root ユーザを含むすべてのユーザでログイン認証エラーが発生し、急にmysql が起動ができなくなる問題が発生するようです。

今回、解決方法をまとめめした。

認証プラグインの問題で MySQL 8.4 が起動できないエラー

MySQL 起動時のエラー

mysql.server start 
. ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/XXXXX.local.pid).

よく見るエラーですが、起動エラーの詳細原因は実際は多岐にわたります。ログを開けば詳細が記録されています。Homebrew であれば、 /opt/homebrew/var/mysql/XXXXX.local.pid.err をご覧ください。

エラー文言が下記の場合、この記事の対象となります。

The plugin ‘mysql_native_password’ used to authenticate user ‘xxxxx’ is not loaded. の場合

認証プラグイン「mysql_native_password」がロードされていないというエラーです。

unknown variable ‘mysql_native_password=on’. の場合

このエラーは MyQL9.0 移行のバージョンで発生しそうです。mySQL5系でも発生するかもしれません(未確認)

これは、my.cnf に mysql_native_password=on が指定されているが、このオプションはもはやサポートされていないというエラーです。詳細は後述をご覧ください。

ログは大事じゃのお。

この起動エラー解決のアプローチ

下記、「mysql 9.2」へのアップグレードがなされた前提で進めます。

エラー解決のアプローチとしては、バージョンをロールバックするのか、もしくは認証プラグインを変更するのかの2つにわかれます。

  • 方法1)root ユーザ、及び必要なユーザの mysql 認証プラグインを変更する。
  • 方法2)mysql 8.0 or 8.4 にロールバックして利用し、mysqld 起動時オプションとして mysql_native_password=ON を付与する
  • 方法3)mysql 5.6 などさらに前にロールバックする (デフォルトが mysql_native_password 認証)

長期的にはバージョンについていく必要がありますので、基本的には方法1を利用したほうがいいでしょう。

方法2,方法3でMySQL 8.0 かそれ以前にロールバックすることで、一時的に簡単に復帰できます。

ただし、ダウングレードはそもそもサポートされていないケースもあり、ロールバックはスムーズにいかない場合もあります。例えば、筆者の環境では MySQL 9.2 -> 8.4 へのダウングレードは下記のエラーでうまく実行できせんでした。

[InnoDB] Invalid MySQL server downgrade: Cannot downgrade from 90200 to 80404. Downgrade is only permitted between patch releases.

この記事では「方法1:mysql 認証プラグインを変更する」についてのみ、深堀りしていきます。

MySQL 認証プラグインを変更してエラーを修正する

環境が MySQL 9.2 ですので、上記の通り、native_password はもう利用できません。以前のバージョンでのユーザーデータを引き継いでいますので、root を含む MySQL ユーザは、mysql_native_password でのグイン認証が設定されたままですので、ログインができない状態になっています。

解決にすすんでいきます。

1)最新の MySQL をインストールが完了していることを確認

まず、MySQL バージョンが最新(MySQL 8.4 か 9.0 以降)であることを確認してください。一度 homebrew でインストールを再実行します。

# brew であれば、最新版を取得
$ brew upgrade mysql

# brew services 実行を停止
$ brew services stop mysql

# 直接 mysql.server を停止してもかまいません。
$ mysql.server stop

停止状態です。この時点で、過去のプロセスが残っていないかも確認してください。過去のプロセスが悪さをすることが非常によくあります。動いている mysql 関連のプロセスは、mysqld や mysqld_safe はすべて消しておいてください。

$ps aux | grep mysql

# プロセス番号を指定して kill。-9 は強制オプション
$ kill -9 3374394

2)ユーザ認証なしで mysql にログインできるようにする

さてはログイン認証が通らないので、認証をスキップしてログインできるようにします。

my.cnf を開いて (MacOS: homebrew の場合 /opt/homebrew/etc/my.cnf )、 [mysqld]セクションに、オプション「skip-grant-tables」を付与します。

[mysqld]
skip-grant-tables

この方法で、mysql.server start コマンドを介して mysqld を起動するさいに起動時に --skip-grant-tables オプションが付与されてくれます。

記載が終わったら、mysql を再起動します。ここでは brew services mysql でなく、直接 mysql.server から起動したほうがよいでしょう。

$ mysql.server restart
... SUCCESS

ちなみに、別の方法では、my.cnf を書き換えず mysqld にオプションをつけて直接起動することも可能です。

$ mysqld --skip-grant-tables

通常は mysql.server start コマンドを介して間接的に起動されたmysqd_safe がバックグラウンドで mysqld を起動しますが、直接 mysql コマンドで実行したターミナルのウィンドウでは mysqld はフロント実行されるため、ターミナルが占有されそのまま起動ログが出力されます。このあとの操作ができませんので、別ウィンドウを開いて操作をつづけます。

3)認証なし起動。ログインする

mysql.server が起動できたらログインします。

$ mysql -u root

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 109
Server version: 9.2.0 Homebrew

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

無事はいれました!

4)権限をリロード

メモリ上に残った権限関連の情報をリロードします。これをやらないと後のコマンドが実行できません。

FLUSH PRIVILEGES;

5)ユーザ認証パスワードを確認

下記のコマンドで認証プラグインを確認します。

SELECT User, Host, plugin FROM mysql.user;

出力がこちら。root に mysql_native_password が指定されていますね。


+------------------+-----------+-----------------------+
| 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 |
+------------------+-----------+-----------------------+

6)認証プラグインを変更

所望のユーザの認証プラグインを、mysql_native_password から caching_sha2_password に変更します。

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'YOUR_PASSWORD'

YOUR_PASSWORD の部分は自分でご設定下さい。

7)最終チェック

これで変更は完了です。一度ログアウトして、mysql を再起動してください。

$ mysql.server resetart
  SUCCESS!

# ログインできれば完了です。
$ mysql -u root -p

うまくいったかな?お疲れ様でした!

その他の注意点

mysql.server 実行時は sudo 実行せず、自分のユーザで実行します。

root で起動すると、あとで関連ファイル(pid ファイルなど)で権限エラーを起こすことがあります。「The server quit without updating PID file」の原因の一つとなります。

慣習的に apachectl は root で実行することで port 80 へのアクセスや、www ユーザによる起動を行うので、つい mysql を root 起動してしまうことがあります。

mysql ログイン認証による起動エラーの参考:

Stack Overflow: MySQL Authentication Plugin Issues on macOS

本記事と同様のエラーについてです。

https://stackoverflow.com/questions/78938322/mysql-authentication-plugin-issues-on-macos

Mysql マニュアル:Mysql Server

mysql.server、mysqld_safe, mysqld の起動について言及されています。
日本語版の最新が 8.0 でしたが、9.2 でも同じと思います:
https://dev.mysql.com/doc/refman/8.0/ja/mysql-server.html

mysql8.4 ではデフォルトが切り替わった認証方法も、オプション付与によりmysql_native_password が依然として利用できる言及があります:
https://dev.mysql.com/doc/refman/8.4/en/native-pluggable-authentication.html (英語)

また、mysql 9.0 で mysql_native_passoword=ON オプションは削除された言及があります:
https://dev.mysql.com/doc/refman/9.0/en/mysql-nutshell.html (英語)