Laravel 6.4.1 SQLSTATE[HY000] [2002] 连接被拒绝

20
我是Laravel开发新手。 我已将Xampp更新到Mac Mojave 10.14.6上的7.3.11版本。 在Laravel项目中,当我运行php artisan migrate命令时,出现以下错误。
SQLSTATE [HY000] [2002]连接被拒绝(SQL:select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type ='BASE TABLE')
当我启动Xampp服务时,我的管理员面板在http://127.0.0.1:8080/phpmyadmin上运行。 我的Laravel工作项目也无法连接到数据库,显示连接被拒绝。 我尝试通过更改.env文件中的DB_PortDB_Host来解决问题。 我尝试清除缓存。
任何帮助将不胜感激。
我的.env文件
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

2
此外,我强烈建议使用Laravel Valet,通过Homebrew安装Nginx和MySQL,而不是使用这种混乱的方式。 - Salim Djerbouh
1
你的MySQL服务器是否运行在3306端口上? - brombeer
@kerbholz 是的,它在同一个端口上。 - Manish Mahajan
我已经通过将Xampp降级到7.1.33来解决了这个问题。 - Manish Mahajan
我重新启动了电脑并开始工作了! - francisco
我在Docker中遇到了竞争条件。等待数据库服务器不仅启动而且可用之后再尝试使用PHP artisan命令解决了这个问题。 - rob
15个回答

23
我也遇到了这个错误,在使用docker-compose进行开发的Laravel新项目中。
我的解决方案是将预先构建的.env文件与我用于构建数据库容器时实际使用的凭据进行比较。 特别是,我使用了DB_HOST=127.0.0.1而不是正确的docker-compose设置中服务名称:DB_HOST=mysql

3
这对我有用,但我还需要运行 php artisan config:clear - Muhammad Sheraz
这很奇怪,我之前遇到一个问题,需要将我的数据库主机更改为localhost,然后当我改变另一个部分时,我又不得不切换回去才解决了问题。 - Sam St Aubyn
DB_HOST=mysql 对我有用,我的 .env 文件设置了 127.0.0.1。 - Abraham Brookes

18

打开 localhost/phpmyadmin 并找到一个名为 User accounts 的选项卡。

找到 root 用户并在你的 .env 文件中设置它的密码,同时不要忘记创建名为 laravel 的数据库(如果不存在)。

然后可以清除配置缓存。

php artisan config:clear

迁移

php artisan migrate

1
这对我没有帮助。但是核心PHP数据库已连接。 - Manish Mahajan

13

我只是遵循了简单的步骤就解决了问题:

打开.env文件

将DB_HOST = 127.0.0.1更改为localhost

完成


在 Laravel >7 的高版本中,DB_HOST 不再接受使用本地 IP 地址(127.0.0.1),而是使用 URL:localhost。我不知道为什么,但使用 localhost 而不是 127.0.0.1 可以正常工作。 - stanley mbote

4

我在MacOs的docker容器中运行laravel和mysql时遇到了相同的问题。
我发现问题出在.env文件里。

.env文件中默认配置为:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_db_name
DB_USERNAME=sail
DB_PASSWORD=password

一些回答建议将DB_HOST更改为:

DB_HOST = localhost

但是对于我来说,它没有起作用...

通过一些研究,我发现在运行 Docker 中的 Laravel 时,DB_HOST 需要期望在 Docker 中运行的数据库服务,在我们的情况下,服务是 MySQL。


因此,我不得不将 .env 更改为以下内容:

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=my_db_name
DB_USERNAME=sail
DB_PASSWORD=password

我还修改了config/database.php文件中的DB_HOST。

'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', 'mysql'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'my_db_name'),
            'username' => env('DB_USERNAME', 'sail'),
            'password' => env('DB_PASSWORD', 'password'),
            'unix_socket' => env('DB_SOCKET', ''),
            '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'),
            ]) : [],
        ],

直到那时,一切才开始正常工作。


3

我曾经遇到同样的问题,但是当我按照以下步骤操作时,问题得以解决。

    php artisan key:generate
    php artisan cache:clear
    php artisan route:clear
    php artisan config:clear 
    php artisan view:clear 

1
仅提供代码的答案几乎总是可以通过添加一些解释来改进。像这样的清单很好,但它并没有解释为什么应该采取每个步骤,或者您认为每个步骤将产生什么好处。答案的目标应该是教育读者并提供可行的解决方案。 - Jason Aller

2

尝试执行以下操作:

php artisan config:cache

然后在您的.env文件中指定您的数据库和端口。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE= YOUR_DATABASE_NAME
DB_USERNAME=root
DB_PASSWORD=

然后运行你的mysql服务器并运行

php artisan migrate

注意:确保你的Xammp服务器完好无损,并且已经启动了mysql(使用apache服务器或任何你正在使用的服务器),并且在运行php artisan migrate之前确保你已经创建了数据库。希望它能为你工作。


1

我遇到了同样的问题。只需重新启动本地主机服务器即Xampp,问题就解决了。


1
在大多数情况下,这是端口配置的问题。您需要检查服务器正在运行的端口。然后您必须编辑项目的.env文件。例如,如果您正在使用mamp,则应将端口更改为8889,而不是laravel的默认3606。对于laravel 8也适用相同的方法。

0
在我的情况下(Windowsx64 + WSL + php/laravel8.1),我能够使用有效的凭据通过 PhPStorm/PyCharm 添加数据源,但每次运行 php artisan migrate 时都会出现 SQLSTATE[HY000] [2002] Connection refused 错误。
我不得不从 XAMPP 控制面板停止 MySql 服务,并通过 mysql-cli 设置 DB 和 USER。
在停止 XAMPP 服务后,执行 sudo service mysql start,然后:
sudo mysql -u root

SHOW DATABASES;
CREATE USER 'elite'@'localhost' IDENTIFIED BY 'elite';
CREATE DATABASE laravel
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE 
TEMPORARY TABLES, LOCK TABLES ON laravel.* TO 'elite'@'localhost';
exit

0

我正在使用 Laravel 8 和 MySQL 与 Docker,我遇到了同样的问题,尝试了几种解决方案都没有用,我删除了容器和卷也没有用,所以我决定重新启动我的操作系统并进入无痕模式,然后一切顺利,于是我回到那个出错的选项卡,删除了会话 cookie,问题就解决了。另一个提示是使用 docker inspect [container--database-id] 来使用数据库容器 IP,而不是 DB_HOST=localhost。抱歉我的英语不好,希望我能帮到你。

验证端口:

'${FORWARD_DB_PORT:-3306}:3306'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接