症状

MySQLに接続しようとすると「Authentication plugin ‘caching_sha2_password’ cannot be loaded」または「Plugin caching_sha2_password could not be loaded」エラーが表示される。

結論:まずこれを確認

  1. クライアントがMySQL 8.0のデフォルト認証プラグイン(caching_sha2_password)に対応しているか確認
  2. 対応していない場合、ユーザーの認証プラグインを mysql_native_password に変更する
  3. または、クライアント/ドライバをアップデートする

トラブルシューティングフロー

    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 以上が必要。

関連するエラー・症状

準備中

解決しない場合