むにえる牧場

毎日むにえるをつくっています

Laravel5.8でMySQL8.0.xを利用する

meuniere.hatenablog.jp

こちらの記事の続きでPDOを導入してmigrateを行おうとしたのですが、エラーが起きて怒られました。
解消手順について書き残しです。

環境

root@be4a101ba48a:/src/sample# php artisan --version
Laravel Framework 5.8.29

root@be4a101ba48a:/src/sample# php --version
PHP 7.3.7 (cli) (built: Jul 12 2019 22:53:38) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
root@9d2a13a3b98c:/# mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

エラー内容

root@372cf107f5b8:/src/sample# php artisan migrate
 
    Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations and table_type = 'BASE TABLE')
 
   at /src/sample/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
     660|         // If an exception occurs when attempting to run a query, we'll format the error
     661|         // message to include the bindings with SQL, which will make this exception a
     662|         // lot more helpful to the developer instead of just the database's errors.
     663|         catch (Exception $e) {
   > 664|             throw new QueryException(
     665|                 $query, $this->prepareBindings($bindings), $e
     666|             );
     667|         }
     668|
 
   Exception trace:
 
   1   PDOException::("PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]")
       /src/sample/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
 
   2   PDO::__construct("mysql:host=mysql;port=3306;dbname=homestead", "root", "secret", [])
       /src/sample/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
 
   Please use the argument -v to see more details.

原因

  • MySQL 8.0.4に上がってからcaching_sha2_passwordというログイン認証方式に変更された
  • PDOが caching_sha2_password に対応していないためエラーになる

という状況でした。

解決策

DockerのMySQLコンテナの設定を変更することで対処しました。
ログイン認証方式をmysql_native_passwordという古い認証方式に変更します。

参考はこの辺り

MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.3.8.1 ネイティブ認証プラグイン

./docker/mysql/my.cnf

[mysqld]
 default-authentication-plugin = mysql_native_password

Dockerfileの変更をしたら、docker-compose up -d --buildとコマンドを入力し、ビルドしなおせばエラーが解消されます。

追記

ついでに、docker-compose.ymlの内容も少しだけ追加
docker-compose.yml

volumes:
       - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
       - ./docker/mysql/data:/var/lib/mysql-files

3行目の/var/lib/mysql-filesがMySQL5.7?あたりで変わったらしいです。
少々古い記事だと/var/lib/mysqlと紹介されていてちょっとだけ詰まりました。