【Laradock】MySQL 構築後のマイグレーションエラー解決法

#はじめに
本記事は、Laradockで最初のマイグレーションする際の
`SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client `の対処
を書いています。
#### すごく大事なこと（笑）
初心者による記事なので、何か間違っていること等ございましたら、ご教授よろしくお願いします！初記事なので、いろいろご指摘（こう書くと分かりやすい！など）くださると嬉しいです。

#前提
本記事は、下記のことを前提としています。

- Dockerをインストール済み
- laradock導入済み

#問題
コンテナー起動後、laravelでマイグレートし、`users_table`と`password_resets_table`を作成する際、下記のエラーが発生。


```terminal
$  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)

  at /var/www/src/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]")
      /var/www/src/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=mysql;port=3306;dbname=homestead", "homestead", "secret", [])
      /var/www/src/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.
```

### このエラーは何を言っているの？
LaravelがMySQLに接続しようとすると、MySQL側のユーザー認証の方法に指定された方式がLaravel側では対応していないという状況。

##解決法
解決法は2つあります。
今回は、2つ目の『MySQLの認証方法の変更』のやり方で進めたいと思います。

1. MySQLのバージョンを固定する方法。
2. MySQLの認証方法の変更


##【解決方法１】 MySQLのバージョンの固定
バージョンの固定のやり方は今回は割愛させていただきます。
どうやら、MySQL8.0.4~だと、整合性が保てないようです。バージョン5.7だとうまく動きそうです。

参考までに下記の記事を共有させていただきます。

-[dockerでmysqlに接続出来ない](https://teratail.com/questions/122336)

##【解決方法2】 MySQLの認証方法の変更
やることは2つあります。
(1) MySQLのユーザー認証方式を変更します。
(2) my.cnfファイルにコードを追加します。

###(1) MySQLのユーザー認証方式の変更
Laradockディレクトリ内で、MySQLのコンテナIDをチェック。

```terminal
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                      NAMES
1cde6228da22        laradock_phpmyadmin   "/run.sh supervisord…"   11 hours ago        Up 10 hours         9000/tcp, 0.0.0.0:8080->80/tcp             laradock_phpmyadmin_1
def340136710        d258f5474a3b          "docker-entrypoint.s…"   11 hours ago        Up 10 hours         0.0.0.0:3306->3306/tcp, 33060/tcp          laradock_mysql_1
c1f1224e8cf5        laradock_nginx        "/bin/bash /opt/star…"   11 hours ago        Up 10 hours         0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
864fda89703e        laradock_php-fpm      "docker-php-entrypoi…"   11 hours ago        Up 10 hours         9000/tcp                                   laradock_php-fpm_1
468bee091fec        laradock_workspace    "/sbin/my_init"          11 hours ago        Up 10 hours         0.0.0.0:2222->22/tcp                       laradock_workspace_1
c1d12e4e707b        docker:dind           "dockerd-entrypoint.…"   11 hours ago        Up 10 hours         2375/tcp                                   laradock_docker-in-docker_1
```
2行目の`NAMES`列が`laradock_mysql_1`の`CONTAINER ID`を確認。今回の場合だと、 `def340136710` に相応する値です。

チェックした`CONTAINER ID`を元にMySQLにログイン。

```terminal
$ docker exec -it def340136710 /bin/bash
root@def340136710:/#

$ mysql -u root -p
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

```

ここでも私は、passwordが分からず引っかかってしましました...
参考までにdatabaseコンテナへの入り方を記載します。

```
$ mysql -u root -p 
(enter password: root )
```

ユーザーの認証方式を確認します。

```terminal
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| homestead        | %         | caching_sha2_password |
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

```
この1行目と2行目の`host`列が`%`の行の`plugin`を`caching_sha2_password`から`mysql_native_password `へ変更します。

```terminal
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
mysql> ALTER USER 'homestead'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';

```

変更後のユーザー認証方式を確認します。

```terminal
sql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| homestead        | %         | mysql_native_password |
| root             | %         | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)
```

上から１，2行目の`plugin`列が`mysql_native_password`に変更されていることを確認します。

###(2) my.cnfファイルにコードを追加します。

```terminal
$ vi laradock/mysql/my.cnf  
```
```html:laradock/mysql/my.cnf
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
default_authentication_plugin= mysql_native_password # <- 追加
```


###ワークスペースへ入る


```terminal
$ docker-compose exec workspace bash
$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
```




##おわりに
Qitaの初投稿だったのですが、やはりインプット後に記事として残すのは、頭が整理されますね！
この習慣を継続し、役に立てるような分かりやすい記事をアップしていきます！

















##参考記事

- [MySQL 8.0以上だとphp artsian migrate時にエラーが発生する](https://github.com/Fendo181/laravel_repos/issues/2)
- [LaradockでDockerによる開発環境を手軽に構築](https://www.wakuwakubank.com/posts/384-laravel-laradock/)
- [【Laravel】MySQL 8でmigration時にエラーが出たときの対処方法](https://takakisan.com/laravel-mysql-8-migration-error-fix/)
- [Laravel & Docker 環境構築 with Laradock](https://qiita.com/shunichi_com/items/9b09c5949233b88b9a4a)
- [Laravel開発環境 with Laradock on Mac 【MySQL8認証対応済】](https://www.shibomb.xyz/entry/2018/10/22/155538)