MySQL8.0 認証方式を変更する(Laravel5)

MySQL8.0 を初めてインストールして、
Laravelでマイグレーションを実行したときにエラーがでて罠にハマりました。

## 追記: 2020.04.12

PHP 7.1.16, 7.2.4 以降のバージョンから `caching_sha2_password` に対応するようになりましたので、この記事の設定は不要となります。

https://www.php.net/manual/ja/ref.pdo-mysql.php

## 環境

- MySQL8.0.x
- PHP < 7.2.4 

## エラー内容

`mysql` コマンドで直接データベースへログインできたのですが、Laravel マイグレーションを実行するとエラーとなりました。

```console
$ php artisan migrate
   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknownto the client (SQL: select * from information_schema.tables where table_schema = blog and table_name = migrations)

  at /home/vagrant/blog/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]")
      /home/vagrant/blog/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:68

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=blog", "vagrant", "P@assw0rd", [])
      /home/vagrant/blog/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:68
```

## 原因： MySQL8.0.4 デフォルトの認証方式変更

- **MySQL8.0.4以降** のログイン認証方式は `caching_sha2_password` がデフォルト
- PHPのMySQL接続ライブラリが `caching_sha2_password `　に未対応のため接続不可
- 解決策としては認証方式を `mysql_native_password` に戻す

[6.5.1.3 Caching SHA-2 Pluggable Authentication](https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html)

## 既存ユーザーの認証方式を確認

```console
> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| vagrant          | 127.0.0.1 | caching_sha2_password |
| vagrant          | 192.168.% | caching_sha2_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | caching_sha2_password |
| vagrant          | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
```

## 対処法1: 既存ユーザーの認証方式を変更

```sql
> ALTER USER 'vagrant'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';
> ALTER USER 'vagrant'@'192.168.%' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';
> ALTER USER 'vagrant'@'localhost' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';
> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';
```

## 対処法2: 新規ユーザー作成時の認証方式を変更

`/etc/my.cnf` に追記

```ini
[mysqld]
default_authentication_plugin=mysql_native_password
```

最初にこれを設定しておくべきでした。。

## Sequel Proで接続できない問題

Sequel ProがMySQL8.0に対応していません！
執筆時のバージョンは1.1.2で1.2以降からMySQL8.0に対応する予定らしいです！

### 代替案

- **推奨** [Sequel AceでMySQLに接続する(Sequel Proの後継)](https://qiita.com/ucan-lab/items/b1304eee2157dbef7774)
- [TablePlusに乗り換える](https://tableplus.io)
- [MySQL8.0.x に Sequel Pro で接続する](https://qiita.com/ucan-lab/items/b68db1db931c954da921)
- [MySQL 8.0がサポートされるまで待つ](https://github.com/sequelpro/sequelpro/issues/2699)

## 関連記事

- [docker-compose MySQL8.0 のDBコンテナを作成する](https://qiita.com/ucan-lab/items/b094dbfc12ac1cbee8cb)