Laravelのmysql接続でちょっとハマったのでメモ。
環境
Laravel 5.7.13
mysql 8.0.12
Laravelをmysqlに接続するにはconfig/database.php、.envを修正する必要がある。
ホスト名、ユーザー名、パスワードの変更をする。
サクッと変更して、さっそく簡単な接続テストを・・・とページにアクセスすると以下のエラー。
SQLSTATE[HY000] [2006] MySQL server has gone away
なんでや!と思って設定を見直すも、database.phpや.envに問題は見当たらない・・・。
少しググってみると、以下のような記事がいくつかヒットした。
mysql8からパスワードの認証方式が変更になった
以前は「mysql_native_password」というパスワード認証方式が使われていたそうだが、mysql8からは「caching_sha2_password」という認証方式に変わったらしい。
そしてLaravelはcaching_sha2_passwordに対応していないため、エラーが起きるとのこと。
ははーん、なるほどね〜、と思いつつ、この認証方式は簡単に変えられるということなので、さっそくmysqlから以下のコマンドで変更を行おうとする。
// mysqlユーザーのパスワード認証方式を確認
SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| cakephp3 | localhost | caching_sha2_password |
| laravel | localhost | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | mysql_native_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)
あれ? ユーザー「laravel」はmysql_native_passwordになってるやん!
なのに繋がらないのはどうして・・・?
Laravel5.7、かつmysql8の環境では「caching_sha2_password」でしか接続できない・・・?
Laravel側のエラー文をよく見てみると、
PDO::__construct(): Unexpected server respose while doing caching_sha2 auth: 109 (0)
とあり、caching_sha2での処理中にエラーが起きた的なことが書いてある。
もしかしてLaravel5.7、mysql8の環境ではmysql_native_passwordではなく、caching_sha2_passwordで処理されているのか・・・?
と思い、認証方式を変更してみる。
// ユーザーのパスワード認証方式を変更
ALTER USER 'laravel'@'localhost' IDENTIFIED WITH caching_sha2_password BY '***';
// caching_sha2_passwordへの変更を確認
SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| cakephp3 | localhost | caching_sha2_password |
| laravel | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | mysql_native_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
この状態で再度接続テスト。結果、動いた!
Laravel5.7から、mysql8の接続にはcaching_sha2_passwordしか認められなくなったのかどうかは定かではないが、とりあえず問題は解決したのでOKということにしておこう・・・。
自分と同じ環境で詰まっている人がいたら、一度mysqlのパスワード認証方式を確認してみるといいかも。