それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

phpでThe server requested authentication method unknown to the client.

php で次のようなエラーが出る

The server requested authentication method unknown to the client

原因 php-mysql の接続でエラー

エラーの原因は mysql の認証方式の変更に対応できないエラー

いままで、mysql は mysql_native_password だったが、mysql8 あたりで caching_sha2_password になっている

対処方法

候補は次の通り、

mysql 8 の caching_sha2_password を殺し、mysql_native_password を使う。

または、

mysql_native_password 時代に対応した mysql 5.x 系を使う。

mysql 5.x 系を使う場合

ubuntu / debianmysql を併存させるのは苦労でしかないので docker を使う

docker run -d --rm \
   --name mysql-5 \
   -p 3304:3306 \ 
   -v /data/mysql5-server/data:/var/lib/mysql \ 
   -e MYSQL_ROOT_PASSWORD=**PASS** \
   mysql:5

あえて古いUbuntuDebianを用意してもいいけど、基本的に非推奨だし、Dockerに閉じ込めればいいわけですから、これでいいでしょう

mysql8 に mysql_native_password を使わせる

これは、ちょっと茨の道。いくつかのポイントを抑える必要がある。

ユーザーの現在の認証方式を確認する。 以下のユーザの通り、mysql_native_password にしていると、mysql_native_passwordを使って認証することになる。

mysql > select User, Plugin from mysql.user;
mysql root@(none):(none)> select User, Plugin from mysql.user;
+---------------------------------+-----------------------+
| User                            | Plugin                |
+---------------------------------+-----------------------+
| connect_test                     | mysql_native_password |
| takuya                          | caching_sha2_password |
| mysql.infoschema                | caching_sha2_password |
+---------------------------------+-----------------------+

mysql_native_password を使う設定

my.cnf で設定を変更する

[mysqld]
default_authentication_plugin=mysql_native_password

再起動する

systemctl restart mysql

注意点。デフォルト値の変更

デフォルト値を変更すると、mysql_native_passwordが優先される。

接続時に mysql_native_password がクライアントに通知される。

caching_sha2_password は使えるけど、トラブルが多い。mysql_native_passwordが先に通ってしまうので。クライアントはmysql_native_passwordを送ってくる。

なので、mysql_native_password と caching_sha2_passwordを混ぜた運用はしないほうがいい。

また caching_sha2_password に未対応のphp といえば、php5.6 や php7.0 なので、そのような古いPHPでしか動かないコードを最新版のMySQLで動かそうとするほうが無茶なので、素直にphpソースコードをアップデートしてパッチを當てるか、古いものは古いものと合わせてDocker環境に閉じ込めて動かしたほうが素直だと思います。

参考資料

https://improve-future.com/mysql-php-the-server-requested-authentication-method-unknown-to-the-client.html