Laravel Sail - SQLSTATE[HY000] [2002] 没有那个文件或目录
Laravel Sail - SQLSTATE[HY000] [2002] No such file or directory
我遵循了 Laravel Sail 的教程并且它工作正常,但是如果我克隆 repo (docker-compose up),在另一个机,我在尝试 运行 容器内迁移时收到以下错误:
SQLSTATE[HY000] [2002] No such file or directory (SQL: create table
migrations
(id
int unsigned not null auto_increment primary key,
migration
varchar(255) not null, batch
int not null) default
character set utf8mb4 collate 'utf8mb4_unicode_ci')
已经尝试了一些解决方案,但没有任何效果。
我的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', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', '/var/run/mysqld/mysqld.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'),
]) : [],
],
我的.env文件:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=code_challenge
DB_USERNAME=root
DB_PASSWORD=
所以,在 database.php 我删除了套接字值:
'unix_socket' => env('DB_SOCKET', '')
并且在 .env 中我保留了以前的值。
不确定是什么原因导致了问题,但现在可以了。
因为您正在尝试通过来自不同容器的套接字连接到数据库容器。
有两个单独的容器 - Laravel 和 MySQL。将其视为两个独立的服务器。
当你在 env 中同时拥有 unix_socket 和 db_host 时,你告诉 laravel 通过 unix_socket 连接到指定主机上的数据库。这就是它不起作用的原因。
当您更新 unix_socket env 时,laravel 尝试通过 TCP 连接到数据库并且它工作。
P.S:我知道这个问题已经为您解决了。但是如果其他人偶然发现了这个问题,他们应该对它为什么起作用以及将来如何解决它有一些解释。
我遵循了 Laravel Sail 的教程并且它工作正常,但是如果我克隆 repo (docker-compose up),在另一个机,我在尝试 运行 容器内迁移时收到以下错误:
SQLSTATE[HY000] [2002] No such file or directory (SQL: create table
migrations
(id
int unsigned not null auto_increment primary key,migration
varchar(255) not null,batch
int not null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')
已经尝试了一些解决方案,但没有任何效果。
我的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', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', '/var/run/mysqld/mysqld.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'),
]) : [],
],
我的.env文件:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=code_challenge
DB_USERNAME=root
DB_PASSWORD=
所以,在 database.php 我删除了套接字值:
'unix_socket' => env('DB_SOCKET', '')
并且在 .env 中我保留了以前的值。
不确定是什么原因导致了问题,但现在可以了。
因为您正在尝试通过来自不同容器的套接字连接到数据库容器。
有两个单独的容器 - Laravel 和 MySQL。将其视为两个独立的服务器。
当你在 env 中同时拥有 unix_socket 和 db_host 时,你告诉 laravel 通过 unix_socket 连接到指定主机上的数据库。这就是它不起作用的原因。
当您更新 unix_socket env 时,laravel 尝试通过 TCP 连接到数据库并且它工作。
P.S:我知道这个问题已经为您解决了。但是如果其他人偶然发现了这个问题,他们应该对它为什么起作用以及将来如何解决它有一些解释。