MYSQL8.0で作成したDBにCakePHPからアクセスできないときに確認しておくこと
ちょっと他の方のCakePHPコードを動かす機会が合ったんですが、微妙に詰まったので記録しておく。 DockerでサクッとMySQL8とCakePHP4系の環境を立ち上げたんですよ。でmigrateするじゃないですか。こうなるんですよ
2020-06-28 03:26:02 Error: [InvalidArgumentException] There was a problem connecting to the database: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client in /var/www/html/mycakeapp/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 82
はい(´・ω・`)
認証できないってやつですね。もちろんUSER/PASSは同じであることを確認済み。
しかし、ついでに入れていたPHPMyAdmin側では認証が通る。とても不思議。MySQL側のコンテナに入ってログインしてみても通る。
ここまでで「これはPHP環境に問題があるのだろう」と特定して深堀り。
まず、php側のDocker環境に入り、iputils-pingを入れて疎通をみる。OK、疎通している。 次に、mariadb_clientを入れてつなぎに行こうとすると
ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
なるほど。caching_sha2_password
が設定されているユーザーになっているのが原因っぽそう。
ちょっと調べてみたところ、MYSQL8.0からデフォルトの認証プラグインが、caching_sha2_password
に変わっているんですが、PDO_MySQLを使う場合この認証方式を使えない模様。
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatible-connectors
で、接続しようとしていたユーザーはcaching_sha2_password
を使う設定になっていたため、USER/PASS合っても弾かれる問題が起こっていたようです。
PHPMyAdmin側でユーザー設定変えてやれば、ちゃんと疎通できるようになりました。