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 (英語)
ログは大事じゃのお。