PHP で MySQL に接続しようとすると、 次のようなエラーが出ることがあります。
PDOException in Connector.php line 55:
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
環境
MySQL の バージョン 8 からこのようなエラーが出るようになりました。 私がこのエラーを出した MySQL のバージョンは、 8.0.11 でした。
- macOS High Sierra version 10.13.6
- MySQL 8.0.11 Homebrew
MySQL 8 からの 2種類の認証プラグイン
MySQL 8 から、 2種類の認証プラグインが使えます。
- mysql_native_password
- 従来からあった認証プラグインです。
- caching_sha2_password
- MySQL version 8 から導入された新しい認証プラグインです。
caching_sha2_password は、 安全なパスワードの暗号化、 キャッシュを用いた認証処理のパフォーマンスの向上等のメリットが多いそうで、 MySQL 8 ではデフォルトで caching_sha2_password が使われるようになっています。
しかし、 PHP で新しい接続プラグインがサポートされていないので(いずれサポートされるとは思いますが)、 caching_sha2_password で管理されているパスワードを使って接続しようとするとエラーが出ます。
PHP で接続できない場合の解決策
どの認証プラグインを使うかはユーザごとの設定です。 次のようにして、ユーザごとの設定を確認できます。
mysql> select User, Plugin from mysql.user;
+------------------+-----------------------+
| User | Plugin |
+------------------+-----------------------+
| sample_user | mysql_native_password |
| mysql.infoschema | mysql_native_password |
| mysql.session | mysql_native_password |
| mysql.sys | mysql_native_password |
| root | caching_sha2_password |
+------------------+-----------------------+
5 rows in set (0.01 sec)
そのため既存のユーザで接続できるようにする場合は、既存ユーザの設定を変更する必要があります。 新しく mysql_native_password を使うユーザを作成して、そのユーザを使って接続することもできます。
既存ユーザの認証プラグインを変更する
次の SQL を実行します。
ALTER USER sample_user@localhost IDENTIFIED mysql_native_password BY 'PASSWORD';
mysql_native_password を利用する新しいユーザを作る
次のようにして、 mysql_native_password を使うユーザを作成します。
CREATE USER another_user@localhost IDENTIFIED mysql_native_password BY 'PASSWORD';
サーバのデフォルト設定を変える
新しいユーザを作成する場合、 認証プラグインを指定する必要があり、 デフォルトでは caching_sha2_password が設定されます。 これを、デフォルトで mysql_native_password を利用するよう設定すれば、 認証方式を指定せずにユーザを作成しても mysql_native_pasword が使われます。
my.cnf に次のように記述し、 サーバを再起動します。
[mysqld]
default_authentication_plugin=mysql_native_password
この記事は拙ブログからの転載です。