1
1

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 1 year has passed since last update.

【Laravel Sail】migrateできないエラー:SQLSTATE[HY000] [2002] No such file or directory

Last updated at Posted at 2022-12-22

現在、エンジニアを目指して学習中です。

Sail環境でマイグレーションを実行しようとしたところ、
エラーが発生したので、メモしておきます。

環境

・PHP 8.1.13
・Laravel 9.3.12
・MySQL 8.0.31
・Docker 20.10.2
・Laravel Sail

エラー内容

Sail環境で、マイグレーションを実行しようとしたら、エラーが発生。

sail artisan migrate
   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = プロジェクト名 and table_name = migrations and table_type = 'BASE TABLE')

指定のファイル・ディレクトリが見つからず、SQLを実行できないというエラー。
つまり、データベースとの接続がうまくいっていない。

確認したけど効かなかったこと

1. config/database.phpunix_socketの設定

これは正しく設定されていた。

config/database.php
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'DBname'),
            'username' => env('DB_USERNAME', 'hoge'),
            'password' => env('DB_PASSWORD', 'hogehoge'),
            'unix_socket' => env('DB_SOCKET', '/var/lib/mysql/mysql.sock'),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : []
        ],

2. .envファイル

この設定も問題なし。

.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=DBname
DB_USERNAME=hoge
DB_PASSWORD=hogehoge

3. コマンドライン上でsail mysqlの実行

MySQLには入れたので、接続も正しくできている。

原因

上述したunix_socketを設定してしまっていたことが、逆に今回の原因。
MAMP環境ではunix_socketを設定していたので、
そのまま設定していたが、コンテナ環境の場合には要らないらしい。

Because you are trying to connect to DB container via socket from different container.
There are two separate containers - Laravel and MySQL. Thinks of it like two separate servers.
When you have both unix_socket and db_host in env, you are telling laravel to connect to db at specified host via unix_socket. That is why it didn't work.
When you update the unix_socket env, laravel try to connect to DB via TCP and it work.

unix_socketとdb_hostの両方を設定すると、unix_socketが優先されるが、
unix_socketでは二つのコンテナ間をうまく通信できないらしい。
だから、コンテナ環境の場合はunix_socketの設定は不要。

config/database.php
'mysql' => [
            // 必要な部分周辺以外略してます。
            'database' => env('DB_DATABASE', 'DBname'),
            'username' => env('DB_USERNAME', 'hoge'),
            'password' => env('DB_PASSWORD', 'hogehoge'),
            // unix_socketの第二引数を空に変更
            'unix_socket' => env('DB_SOCKET', ''),
        ],

これでマイグレーションが実行できるようになりました。

ソケットについてはこんな記事が。
通信、ネットワーク系の勉強もしていかないとなあ。。

参考

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?