MySQL8.0でLaravelのmigrationがエラーになる対策

環境

$ php artisan --version
Laravel Framework 5.8.11

$ mysql --version
mysql  Ver 8.0.13 for osx10.13 on x86_64 (Homebrew)

発生したエラー

$ php artisan migrate
The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = *** and table_name = migrations)

エラーの原因

MySQL8.0以降からログイン認証方式が変更しました。
caching_sha2_password がデフォルトになりました。

解決策

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

現状の認証方式を確認

// MySQlを起動します
$ mysql.server start

// MySQLに接続します
$ mysql -u root -p
Enter password: 

// 以下のコマンドを使います
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

caching_sha2_password の認証方式が使われていることがわかります。

ユーザーの認証方式を変更

上記のuserrootの認証方式を変更する場合

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '好きなパスワード';
Query OK, 0 rows affected (0.10 sec)

認証方式の変更時にこんなエラーが出た場合

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

パスワードがポリシーに引っかかって、変更できなかったようです。パスワードのポリシーを確認します。

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+

Password Validation Options and Variables
こちらのドキュメントを参考にしつつ、適切なパスワードに変更し、再度ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ポリシー通りのパスワード';を実行してください。

Migrationを実行

mysql> exit

// マイグレーションを実行します
$ php artisan migrate

エラーが表示されなければOKです🎉

認証方式を変更したのに、マイグレーションでエラーが出た場合

SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO) (SQL: select * from information_schema.tables where table_schema = *** and table_name = migrations)

こちらはLaravelアプリケーションの設定の問題です。
先ほどユーザーrootのパスワードを変更しましたので.envファイルのDB_PASSWORDを変更ください。

新規ユーザーの認証方式の変更

既存ユーザーの認証方式の変更はできるようになりましたが新規ユーザーを作るたびに変更するのは面倒です。

そのため新規ユーザー作成時の認証方式もあらかじめ変更しておきましょう

// /etc/my.cnfの場所を探します
$ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf

// /etc/my.cnfを編集します
$ sudo vim /etc/my.cnf

/etc/my.cnfに以下を追加してください。

[mysqld]
default-authentication-plugin = mysql_native_password

参考文献

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