仮想環境での 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を実行して無事にテーブルが作成されました。

スーパーソフトウエアの採用情報

あなたが活躍できるフィールドと充実した育成環境があります

blank
blank