You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony执行make:migration报错SQLSTATE[HY000][2002]连接拒绝求助

Symfony数据库迁移连接拒绝问题排查

问题现象

运行bin/console make:migration时触发如下错误:

In ExceptionConverter.php line 103:                                                                                 
  An exception occurred in the driver: SQLSTATE[HY000] [2002] Connection refused                                                                                    

In Exception.php line 28:                                        
  SQLSTATE[HY000] [2002] Connection refused   

In Driver.php line 28:                                    
  SQLSTATE[HY000] [2002] Connection refused

当前环境配置

.env 文件内容

# In all environments, the following files are loaded if they exist,
# the latter taking precedence over the former:
#
#  * .env                contains default values for the environment variables needed by the app
#  * .env.local          uncommitted file with local overrides
#  * .env.$APP_ENV       committed environment-specific defaults
#  * .env.$APP_ENV.local uncommitted environment-specific overrides
#
# Real environment variables win over .env files.
#
# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
# https://symfony.com/doc/current/configuration/secrets.html
#
# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration

###> symfony/webapp-pack ###
MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
###< symfony/webapp-pack ###

###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=dec360f5f5fb625aa22fd102dc475293
###< symfony/framework-bundle ###

###> doctrine/doctrine-bundle ###
# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
#
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"

DATABASE_URL="mysql://20_wroblewska:password@127.0.0.1:3306/20_wroblewska?serverVersion=5.7&charset=utf8mb4"

# DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=14&charset=utf8"
###< doctrine/doctrine-bundle ###

###> symfony/messenger ###
# Choose one of the transports below
# MESSENGER_TRANSPORT_DSN=doctrine://default
# MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages
# MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages
###< symfony/messenger ###

###> symfony/mailer ###
# MAILER_DSN=null://null
###< symfony/mailer ###

初始自动生成的 docker-compose.yaml

version: '3'

services:
###> doctrine/doctrine-bundle ###
  database:
    image: postgres:${POSTGRES_VERSION:-14}-alpine
    environment:
      POSTGRES_DB: ${POSTGRES_DB:-app}
      # You should definitely change the password in production
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!}
      POSTGRES_USER: ${POSTGRES_USER:-app}
    volumes:
      - db-data:/var/lib/postgresql/data:rw
      # You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data!
      # - ./docker/db/data:/var/lib/postgresql/data:rw
###< doctrine/doctrine-bundle ###

volumes:
###> doctrine/doctrine-bundle ###
  db-data:
###< doctrine/doctrine-bundle ###

修改后的 docker-compose.yaml

version: '3'

services:
  mysql:
        container_name: symfony_mysql
        image: mysql
        ports:
            - "3307:3306"   
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: 20_wroblewska
            MYSQL_USER: 20_wroblewska
            MYSQL_PASSWORD: password

问题排查及修复步骤

1. 端口不匹配(核心问题)

你修改后的docker-compose把MySQL容器的3306端口映射到了宿主机的3307端口,但.env里的DATABASE_URL还是用的3306端口,导致Symfony找不到数据库服务。

修复方案二选一:

  • 方案一:修改.env中的DATABASE_URL端口为3307:
    DATABASE_URL="mysql://20_wroblewska:password@127.0.0.1:3307/20_wroblewska?serverVersion=5.7&charset=utf8mb4"
    
  • 方案二:修改docker-compose的端口映射为3306:3306,保持和.env一致:
    ports:
        - "3306:3306"
    

2. 确认MySQL容器正常运行

执行以下命令确保容器启动且无错误:

  • 启动容器:docker-compose up -d
  • 查看运行状态:docker ps,确认symfony_mysql容器状态为Up
  • 查看容器日志:docker logs symfony_mysql,检查是否有启动失败的报错(比如MySQL版本兼容、权限问题)

3. 检查是否有.env.local覆盖配置

如果项目中存在.env.local文件,它的优先级高于.env,需要确认里面的DATABASE_URL配置和你预期的一致,避免被覆盖。

4. 清理Symfony缓存

运行命令清理dev环境缓存,确保配置生效:

bin/console cache:clear

5. 验证数据库连接

可以用以下命令测试Symfony是否能正常连接数据库:

bin/console doctrine:query:sql "SELECT 1"

如果连接成功,再重新执行make:migration即可。

内容的提问来源于stack exchange,提问作者user15020654

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:18:17