我首先想说,我理解您的痛苦。最近我也是Rails 3 + Heroku + Amazon RDS的新手。但是,今晚我解决了这个问题,并立即上Stack Overflow告诉其他遇到问题的人。我稍后会在博客中写一篇文章。
您可能会跳过其中的一些内容,但我会在我的回答中尽可能详细,包括您需要采取的步骤以及我遇到的一些陷阱和问题。
陷阱#1:heroku无法安装mysql2 gem,出现以下错误:
You have added to the Gemfile:
* mysql2
FAILED: http://devcenter.heroku.com/articles/bundler
! Heroku push rejected, failed to install gems via Bundler
解决方案:对于任何要求较高的工作,我几乎总是使用PostgreSQL,而对于沙盒和实验,我只需使用SQLite3快速进出。真正的问题在于我没有在本地机器上运行MySQL。当我回来尝试在本地运行
bundle install
时,自然会因为找不到mysql库而失败。我相信有一种方法可以解决这个问题,但我选择了安装本地mysql。之后,我能够轻松地运行
bundle install
。此外,
git push heroku master
也没有失败地将应用程序推送到Heroku。
Installing activerecord (3.0.6)
Installing activeresource (3.0.6)
>>>>Installing mysql2 (0.3.2) with native extensions<<<<
Using bundler (1.0.7)
Installing thor (0.14.6)
Installing railties (3.0.6)
Installing rails (3.0.6)
Installing sqlite3 (1.3.3) with native extensions
Your bundle is complete! It was installed into ./.bundle/gems/
Compiled slug size is 3.9MB
-----> Launching... done
http://myapp.heroku.com deployed to Heroku
注意事项 #2:我安装了mysql2宝石库,但我的应用程序仍然无法正常运行。通过执行heroku logs
命令之后,发现以下错误信息:
RuntimeError (!!! Missing the mysql2 gem. Add it to your Gemfile: gem 'mysql2'):
什么?我刚刚把它添加到我的Gemfile中,提交并成功推送了!我真的认为有人在对我开恶作剧。进一步研究和调试发现,heroku rake db:migrate
返回:
WARNING: This version of mysql2 (0.3.2) doesn't ship with the ActiveRecord adapter bundled anymore as it's now part of Rails 3.1
WARNING: Please use the 0.2.x releases if you plan on using it in Rails <= 3.0.x
解决方案: 我使用gem uninstall mysql2
卸载了mysql2宝石,并修改了gemfile中的一行,使之变为:
gem 'mysql2', '< 0.3'
这安装了mysql2 gem的0.2.7版本,也成功地在Heroku上安装了。
注意事项#3:在安装了正确版本的mysql2 gem之后,运行
heroku rake db:migrate
仍然返回相同的错误:
rake aborted!
!!! Missing the mysql2 gem. Add it to your Gemfile: gem 'mysql2'
好的,我做了更多的研究并找到了这个帖子,它基本上告诉我适配器正在尝试使用“mysql”适配器而不是“mysql2”适配器。
解决方案:解决此问题的方法是在heroku config
中手动设置DATABASE_URL
以使用mysql2://
,方法如下:
heroku config:add DATABASE_URL=mysql2://user:password@dbInstanceName.hostname.us-east-1.amazonaws.com/databaseName
您可以在AWS配置面板中,通过点击您正在使用的数据库找到此URL中的"dbInstanceName.hostname.us-east-1.amazonaws.com"部分。
这必须使用命令行工具完成,并且不能使用Web控制面板上的RDS插件GUI添加,因为Heroku不会将其作为有效的数据库URL接受。
问题#4:安全配置不正确将不返回有用的错误信息。
解决方案:确保已将安全组添加到您的RDS配置中,以允许Heroku访问您的RDS实例,并将该安全组添加到您的实例中。如果需要CLI帮助,请查看
Heroku上的RDS文档或登录到您的AWS控制台并执行以下操作:
1.单击顶部的RDS选项卡。
2.单击左侧列中的DB安全组。
3.单击“创建DB安全组”。
4.输入名称和描述(例如:名称:Heroku,描述:允许Heroku访问!)。
5.在下面的面板中,选择新组,通过从下拉列表中选择“EC2安全组”来创建新授权。
6.对于安全组,请输入:“default”,对于AWS账户ID,请输入:“098166147350”(这很重要;此帐户号属于Heroku,必须将其添加到默认安全组中才能正常工作)。
7.单击“添加”。
8.重要! 修改现有数据库并将新的安全组添加到其中。
因此,如果您已经:
1.安装了正确版本的mysql2 gem(<0.3)
2.通过正确设置DATABASE_URL来设置heroku配置以使用mysql2适配器。
3.确保Heroku可以访问您的RDS,方法是在AWS RDS上创建相应的安全组,并将该安全组添加到您的数据库中,
那么您现在就可以在Heroku上使用RDS与Rails 3应用程序了。 :)