概要
- EC2にPHP/Laravelの環境を構築し同じEC2内にMySQLをたてていざマイグレーションしようと思ったらできなかったので問題を解決してみる。
ご注意
- 今回の作業は主に検証のために環境構築を行いました。本来Laravelでマイグレーションの行うことのできるMySQLユーザーはrootユーザーとは別に準備すべきです。(せめて当該DBのみselect updateが行える権限に絞るべき)
問題までの経緯
- EC2 AmazonLinux2インスタンス起動
- PHPインストール完了
- composerインストール完了
- Laravelインストーラーインストール完了
- MySQLインストール完了
- MySQLの起動とrootユーザーでのログインとDBの作成完了
- Apacheインストール完了
- Apacheのドキュメントルートに
$ laravel new test
を実行してlaravelのtestブロジェクトの作成完了 -
http://EC2インスタンスのパブリックIP
でLaravelのwelcome画面が表示される事を確認 - .envにMySQL系の情報を記載完了
- マイグレートコマンドを実行してマイグレーションを実行
問題
- 下記のエラーが発生してマイグレーションが実行できない。
$ php artisan migrate
Illuminate\Database\QueryException
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO) (SQL: select * from information_schema.tables where table_schema = test and table_name = migrations and table_type = 'BASE TABLE')
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:716
712▕ // If an exception occurs when attempting to run a query, we'll format the error
713▕ // message to include the bindings with SQL, which will make this exception a
714▕ // lot more helpful to the developer instead of just the database's errors.
715▕ catch (Exception $e) {
➜ 716▕ throw new QueryException(
717▕ $query, $this->prepareBindings($bindings), $e
718▕ );
719▕ }
720▕ }
+33 vendor frames
34 artisan:37
Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
問題解決までの経緯
-
.envに記載したMySQL系の情報(特にrootユーザーのユーザー名、パスワード)に誤りが無いか確認
- .envの情報をコピペーして
$ mysql
コマンドでターミナルからログインすることはできたので問題なさそう。
- .envの情報をコピペーして
-
MySQL8系からデフォルトの認証方式が変更になった記憶があったので確認してみた。
-
下記のリンクに認証方式変更になった旨記載されていた。
-
-
下記の方法でrootユーザーの認証プラグインを「mysql_native_password」に変更した。
-
しかしこのままだと新しくMySQLのユーザーを追加した時に新しいの方の認証プラグイン「caching_sha2_password」で認証情報が登録されてしまう。
-
下記の方法で当該サーバーのMySQLのデフォルトの認証プラグインを「mysql_native_password」に変更しておく。
-
再びマイグレーションを実行したが、同様のエラーが出てマイグレーションをする事ができない。
-
ダメ元でLaravelの設定のキャッシュをクリアして見る。
$ php artisan config:cache
-
設定が反映されたのかマイグレーションできるようになった。
-
おそらく、キャッシュのクリアだけではだめでMySQLの設定変更 → キャッシュクリア → マイグレーションの流れで解決できたものと思われる。