LoginSignup
7
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-25

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

7
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10