8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-06

#はじめに
本記事は、Laradockで最初のマイグレーションする際の
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client の対処
を書いています。

すごく大事なこと(笑)

初心者による記事なので、何か間違っていること等ございましたら、ご教授よろしくお願いします!初記事なので、いろいろご指摘(こう書くと分かりやすい!など)くださると嬉しいです。

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

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

#問題
コンテナー起動後、laravelでマイグレートし、users_tablepassword_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の認証方法の変更』のやり方で進めたいと思います。

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

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

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

-dockerでmysqlに接続出来ない

##【解決方法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_1CONTAINER 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列が%の行のplugincaching_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  
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の初投稿だったのですが、やはりインプット後に記事として残すのは、頭が整理されますね!
この習慣を継続し、役に立てるような分かりやすい記事をアップしていきます!

##参考記事

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?