症状
MySQLに接続しようとすると「Authentication plugin ‘caching_sha2_password’ cannot be loaded」または「Plugin caching_sha2_password could not be loaded」エラーが表示される。
結論:まずこれを確認
- クライアントがMySQL 8.0のデフォルト認証プラグイン(caching_sha2_password)に対応しているか確認
- 対応していない場合、ユーザーの認証プラグインを
mysql_native_passwordに変更する - または、クライアント/ドライバをアップデートする
トラブルシューティングフロー
flowchart TD
A[認証プラグインエラー発生] --> B{MySQLサーバーのバージョンは?}
B -->|8.0以上| C{クライアントは8.0対応?}
B -->|5.7以下| D[別の原因を調査]
C -->|対応| E[SSL/TLS設定を確認]
C -->|非対応| F{クライアント更新可能?}
F -->|可能| G[クライアントをアップデート]
F -->|不可| H[認証プラグインを変更]
E --> I[接続文字列を確認]
H --> J[mysql_native_passwordに変更]
よくある原因
- クライアントが古い - MySQL 8.0より前のクライアントライブラリを使用している
- ドライバが非対応 - 使用しているプログラミング言語のMySQLドライバが caching_sha2_password 未対応
- SSL/TLSが無効 - caching_sha2_password はSSL接続またはRSA鍵交換が必要
- サーバー設定の不一致 - default_authentication_plugin の設定とユーザー設定が異なる
- libmysqlclient が古い - システムにインストールされているMySQLクライアントライブラリが古い
- Docker/コンテナ環境 - 古いMySQLイメージを使用している
確認手順
ステップ1: MySQLサーバーのバージョンを確認する
mysql --version
または接続できる場合:
mysql -u root -p -e "SELECT VERSION();"
🔍 チェックポイント: 8.0以上であれば caching_sha2_password がデフォルト
ステップ2: 対象ユーザーの認証プラグインを確認する
mysql -u root -p -e "SELECT user, host, plugin FROM mysql.user WHERE user = '対象ユーザー名';"
🔍 チェックポイント: plugin 列が caching_sha2_password になっているか確認
ステップ3: クライアントの対応状況を確認する
# libmysqlclient のバージョン確認(Linux)
dpkg -l | grep libmysqlclient
# または
rpm -qa | grep mysql-libs
🔍 チェックポイント: バージョンが 8.0 以上であれば対応している
ステップ4: 認証プラグインを変更する(必要な場合)
mysql -u root -p
ALTER USER '対象ユーザー'@'ホスト' IDENTIFIED WITH mysql_native_password BY 'パスワード';
FLUSH PRIVILEGES;
🔍 チェックポイント: Query OK が表示されれば変更完了
ステップ5: 新規ユーザー作成時のデフォルトを変更する(オプション)
/etc/mysql/mysql.conf.d/mysqld.cnf または /etc/my.cnf に追加:
[mysqld]
default_authentication_plugin=mysql_native_password
sudo systemctl restart mysql
🔍 チェックポイント: MySQLが正常に再起動すること
ステップ6: 接続を再テストする
mysql -u 対象ユーザー -p -h ホスト名
🔍 チェックポイント: エラーなく接続できれば解決
NG行動(やってはいけないこと)
- パスワードなしユーザーを作成する - セキュリティリスクが高い
- すべてのユーザーの認証プラグインを一括変更する - 既存アプリケーションに影響する可能性がある
- skip-grant-tables で起動する - 認証を完全に無効化するため危険
- 本番環境で設定変更後に再起動テストをしない - 設定ミスでサービス停止の可能性がある
よくある質問(FAQ)
Q1: mysql_native_password に変更するとセキュリティは下がる?
A: caching_sha2_password の方がセキュリティは高いが、mysql_native_password も十分に安全。SSL/TLS接続と組み合わせることを推奨。
Q2: Docker環境で同じエラーが出る場合は?
A: MySQLコンテナ起動時に環境変数 MYSQL_ROOT_PASSWORD と合わせて --default-authentication-plugin=mysql_native_password オプションを指定する。または mysql:5.7 イメージを使用する。
Q3: PHPやPythonから接続できない場合は?
A: 各言語のMySQLドライバを最新版にアップデートする。PHP は mysqlnd 拡張が 7.1.16 以上、Python は mysql-connector-python 8.0 以上が必要。
関連するエラー・症状
準備中
解決しない場合
- MySQL 8.0 公式ドキュメント - 認証プラグイン
- 確認すべきログ:
/var/log/mysql/error.logまたはmysqld.log - 次に調べるキーワード: 「MySQL SSL接続 設定」「MySQL RSA公開鍵」「MySQL クライアント アップグレード」