MacOS: mysql 起動における mysql_native_password のエラーと解決まで

最終更新:2025-04-15 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 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 (英語)