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 / debian で mysql を併存させるのは苦労でしかないので 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
あえて古いUbuntuやDebianを用意してもいいけど、基本的に非推奨だし、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環境に閉じ込めて動かしたほうが素直だと思います。