#はじめに
本記事は、Laradockで最初のマイグレーションする際の
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
の対処
を書いています。
すごく大事なこと(笑)
初心者による記事なので、何か間違っていること等ございましたら、ご教授よろしくお願いします!初記事なので、いろいろご指摘(こう書くと分かりやすい!など)くださると嬉しいです。
#前提
本記事は、下記のことを前提としています。
- Dockerをインストール済み
- laradock導入済み
#問題
コンテナー起動後、laravelでマイグレートし、users_table
とpassword_resets_table
を作成する際、下記のエラーが発生。
$ 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の認証方法の変更』のやり方で進めたいと思います。
- MySQLのバージョンを固定する方法。
- MySQLの認証方法の変更
##【解決方法1】 MySQLのバージョンの固定
バージョンの固定のやり方は今回は割愛させていただきます。
どうやら、MySQL8.0.4~だと、整合性が保てないようです。バージョン5.7だとうまく動きそうです。
参考までに下記の記事を共有させていただきます。
##【解決方法2】 MySQLの認証方法の変更
やることは2つあります。
(1) MySQLのユーザー認証方式を変更します。
(2) my.cnfファイルにコードを追加します。
###(1) MySQLのユーザー認証方式の変更
Laradockディレクトリ内で、MySQLのコンテナIDをチェック。
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にログイン。
$ 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 )
ユーザーの認証方式を確認します。
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
へ変更します。
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';
変更後のユーザー認証方式を確認します。
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)
上から1,2行目のplugin
列がmysql_native_password
に変更されていることを確認します。
###(2) my.cnfファイルにコードを追加します。
$ vi 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 # <- 追加
###ワークスペースへ入る
$ 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の初投稿だったのですが、やはりインプット後に記事として残すのは、頭が整理されますね!
この習慣を継続し、役に立てるような分かりやすい記事をアップしていきます!
##参考記事