目次
PHP で MySQL に接続しようとすると、 次のようなエラーが出ることがあります。
1 2 |
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 で接続できない場合の解決策
どの認証プラグインを使うかはユーザごとの設定です。 次のようにして、ユーザごとの設定を確認できます。
1 2 3 4 5 6 7 8 9 10 11 |
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 を実行します。
1 |
ALTER USER sample_user@localhost IDENTIFIED mysql_native_password BY 'PASSWORD'; |
mysql_native_password を利用する新しいユーザを作る
次のようにして、 mysql_native_password
を使うユーザを作成します。
1 |
CREATE USER another_user@localhost IDENTIFIED mysql_native_password BY 'PASSWORD'; |
サーバのデフォルト設定を変える
新しいユーザを作成する場合、 認証プラグインを指定する必要があり、 デフォルトでは caching_sha2_password
が設定されます。 これを、デフォルトで mysql_native_password
を利用するよう設定すれば、 認証方式を指定せずにユーザを作成しても mysql_native_pasword
が使われます。
my.cnf
に次のように記述し、 サーバを再起動します。
1 2 |
[mysqld] default_authentication_plugin=mysql_native_password |