Heroku部署Rails应用生产环境MySQL配置及迁移问题咨询
问题1解答
- Heroku部署的Rails应用默认会优先读取
DATABASE_URL环境变量作为数据库连接配置,你在database.yml中写的production配置会被该环境变量覆盖。 - 如果你是主动安装的ClearDB MySQL插件,要使用ClearDB分配的数据库,有两种配置方式:
- 直接修改
database.yml的production块,不用单独填各个参数,直接指定url即可,注意适配Rails的mysql2适配器:
production: <<: *default url: <%= ENV['CLEARDB_DATABASE_URL'].sub('mysql://', 'mysql2://') %>- 如果你要分开写各个参数,需要把
database字段的值改为CLEARDB_DATABASE_URL里的<database1>,你当前配置里填的exampleapp是本地开发库的名字,和生产库名不匹配,会导致连接错误。
- 直接修改
- 如果没有特殊需求,优先使用ClearDB提供的
CLEARDB_DATABASE_URL即可,额外存在的DATABASE_URL大概率是之前配置遗留的无效值。
问题2解答
- 你检查生产库的方式是正确的,使用ClearDB分配的用户名、密码、主机登录后查询的就是你配置的生产库内容。
- 执行
heroku run rails db:migrate没有生成表的核心原因是你的Rails应用没有连接到你检查的这个<database1>库:要么是应用优先读了DATABASE_URL,迁移都跑在了<database2>库中,要么是你database.yml里的database字段配置错误,连接到了不存在的库。你可以登录<database2>库执行show tables验证是不是迁移都跑在了这个库中。 - 手动执行SQL建表是可以和应用正常关联的,只要你建的表结构、字段命名完全符合Rails迁移的规则,同时要记得同步
schema_migrations表的迁移记录,否则后续执行迁移命令会出现重复执行的错误。 - 本地数据迁移到生产环境可以直接用mysqldump工具:
- 本地导出数据库备份:
mysqldump -u本地用户名 -p 本地数据库名 > backup.sql,执行后输入本地数据库密码即可生成备份文件 - 导入备份到生产库:
mysql -u<username1> -p<password1> -h<host1> <database1> < backup.sql,注意密码和-p参数之间不要留空格。
- 本地导出数据库备份:
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

