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
相关产品推荐
相关产品推荐

