仮想環境での Laravel を使用したデータベース接続
こんにちは、技術部の M です。
今回は備忘録も兼ねて、仮想環境での Laravel を使用した開発をしている際に、データベース接続に手こずった話について書いていきます。
同じ症状が出ている人の手助けになれば幸いです。
環境
Linux on x86_64
Ubuntu 22.04.2
Laravel Framework 10.12.0
PHP 8.1.2
mysql Ver 8.0.33
やりたいこと
php artisan migrate
を実行して、DB にテーブルを作成する。
エラー確認
```
$ php artisan migrate
Illuminate\Database\QueryException
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (Connection: mysql, SQL: select * from information_schema.tables where table_schema = ec and table_name = migrations and table_type = 'BASE TABLE')
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:793
789▕ // If an exception occurs when attempting to run a query, we'll format the error
790▕ // message to include the bindings with SQL, which will make this exception a
791▕ // lot more helpful to the developer instead of just the database's errors.
792▕ catch (Exception $e) {
➜ 793▕ throw new QueryException(
794▕ $this->getName(), $query, $this->prepareBindings($bindings), $e
795▕ );
796▕ }
797▕ }
+38 vendor frames
39 artisan:37
Illuminate\Foundation\Console\Kernel::handle()
```
root ユーザーにアクセス権限がないということでエラーが出ました。
試したこと(1)
エラーメッセージをそのまま検索にかけると、上記のエラーは DB への接続設定が一致しないことで起こることが多いという結論になりました。
```
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=使用するDB名
DB_USERNAME=root
DB_PASSWORD=設定したパスワード
```
config/database.php
```
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', '使用するDB名'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', '設定したパスワード'),
```
[結果]
上記のように設定を編集し再度コマンドを実行しましたが、同じエラー結果が出力されました。
試したこと(2)
(1)の方法では解決することができなかったため、MySQL の認証プラグインを見直すことにしました。
```
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | auth_socket |
+------------------+-----------+-----------------------+
```
確認すると root ユーザーではauth_socket
が適用されていることが分かりました。
auth_socket
を使用すると、OS のユーザー名と同じユーザー名の MySQL アカウントはパスワードを入力せずにログインできるようになります。
しかし今回は、root ユーザーで DB に接続しようとしていたので、そのため受けつけてもらえなかったようです。
下記のコマンドでcaching_sha2_password
を使用するように変更しました。
```
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password';
```
[結果]
認証プラグインを変更後、php artisan migrate
を実行して無事にテーブルが作成されました。
関連記事
- 2023-09-01
- テクノロジー