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 9.2」へのアップグレードがなされた前提です。
エラー解決のアプローチとしては大きく2種類ありますが、基本的には方法1を利用したほうがいいでしょう
- 方法1)root ユーザ、及び必要なユーザの mysql 認証プラグインを変更する。
- 方法2)mysql 8.0 or 8.4 にロールバックして利用し、mysqld 起動時オプションとして mysql_native_password=ON を付与する
- 方法3)mysql 5.6 などさらに前にロールバックする (デフォルトが mysql_native_password 認証)
方法2,方法3でのロールバックはスムーズにいかない場合もありますが、mysql を version 8.0 以前にロールバックすることで、一時的に復帰できます。
ただし、長期的にバージョンを上げていく必要がありますので、根本的な解決とは言い難いです。ダウングレードはそもそもサポートされていないケースもあります。例えば、筆者の環境では 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_native_password でのログイン認証が設定されたままですので、ログインできなくなっています。
1)最新のmysql が起動することを確認
さて、mysql バージョンが最新(8.4 か 9.0 以降)であることを確認してください。
# brew であれば、最新版を取得
$ brew upgrade mysql
# brew services 実行を停止
$ brew services stop mysql
# or 直接 mysql.server を停止
$ mysql.server stop
試しにスタートしようとしてみます。
mysql.server start
. ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/XXXXX.local.pid).
エラーですが、これだけだとなんのこっちゃよくわかりませんが、ログを開けば詳細が記録されています。
/opt/homebrew/var/mysql/XXXXX.local.pid.err
[System] [MY-015015] [Server] MySQL Server - start.
...略・・
[Warning] [MY-010312] [Server] The plugin 'mysql_native_password' used to authenticate user 'root'@'localhost' is not loaded. Nobody can currently login using this account.
「ユーザ認証に使われるプラグイン mysql_native_password がロードされていません。現在は誰もこのアカウントにログインできません」とのことです。
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 を再起動します。
$ mysql.server restart
... SUCCESS
なお別の方法では、my.cnf を書き換えず mysqld にオプションをつけて直接起動することも可能です。
$ mysqld --skip-grant-tables
mysqld は、通常は mysql.server start コマンドを介して(正確には起動されたmysqd_safe が)バックグラウンドでmysqldを起動しますが、このコマンドを実行したターミナルのウィンドウではフロント実行されるため、ターミナルが占有され、そのまま起動ログが出力されます。このあとの操作ができませんので、別ウィンドウを開いて操作をつづけます
※起動エラーが出る場合
なお、古い mysql プロセスが残ってしまっている場合、mysql 起動エラーを起こしやすいようです。エラーが出る場合はプロセスを一度すべて kill してスタートコマンドをやり直してみてください。
$ ps aux | grep mysql
# プロセス番号を指定して kill
$ kill -9 3374394
筆者も何度かエラーを食らったのち、プロセスを確認しつつ、起動に成功しました。
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;
+------------------+-----------+-----------------------+
| 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 |
+------------------+-----------+-----------------------+
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 ログイン認証による起動エラーの参考:
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 (英語)