Heroku部署的Rails应用执行db:migrate提示无法通过socket连接本地MySQL
根因分析
你的database.yml中production配置继承了default块的host: localhost、socket: /var/run/mysqld/mysqld.sock配置,而Heroku运行环境没有部署本地MySQL服务,也不存在对应的套接字文件,因此会触发连接失败报错。
修复步骤
- 先确认你已经在Heroku应用中安装了MySQL类附加组件(常用的为JawsDB、ClearDB),安装完成后Heroku会自动生成对应远程数据库的连接环境变量,通常为
DATABASE_URL。 - 修改
config/database.yml的production块,覆盖从default继承的本地连接参数,优先读取环境变量配置,修改示例如下:
production: <<: *default # 覆盖本地连接配置 host: nil socket: nil # 直接使用Heroku提供的DATABASE_URL即可,无需单独配置各参数 url: <%= ENV["DATABASE_URL"] %> encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
- 把修改后的配置提交代码,推送到Heroku:
git add config/database.yml git commit -m "适配Heroku生产环境数据库连接配置" git push heroku main
- 重新执行迁移命令即可:
heroku run rails db:migrate
补充说明
如果你的附加组件没有自动生成DATABASE_URL,可以手动将附加组件提供的数据库连接地址、用户名、密码等信息设置为Heroku环境变量,命令为heroku config:set 变量名=变量值,再对应修改database.yml的配置即可。
内容的提问来源于stack exchange,提问作者Hà Mai
相关产品推荐
相关产品推荐

