Help us understand the problem. What is going on with this article?

Laravel5.7、mysql8の環境でDB接続が失敗する場合の対応

More than 1 year has passed since last update.

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.0 認証方式を変更する

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のパスワード認証方式を確認してみるといいかも。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away