尝试连接到AWS MySQL实例时,ActiveRecord NoDatabaseError

时间:2018-02-19 19:36:01

标签: mysql ruby-on-rails amazon-web-services activerecord

我们以前通过ActiveRecord成功地从Rails连接到AWS MySQL实例,但是在我们最近向Heroku推送时,该连接被切断了。我们无法理解为什么,因为我们在AWS RDS设置上启用了所有流量,并且我们的database.yml配置文件中的凭据没有更改。推动Heroku的唯一重大变化是添加了dovenv gem并将对环境变量的控制权传递给了gem。

在我们的三个环境(开发,测试,生产)中启动我们的rails服务器时,我们从ActiveRecord收到NoDatabaseError:

ActiveRecord::NoDatabaseError - Unknown database '<database_name>.us-east-1.rds.amazonaws.com'

我们可以通过MySQL CLI 成功连接到数据库。

database.yml中:

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: "<username>"
  password: "<password>"
  host: <database_name>.us-east-1.rds.amazonaws.com
  port: <port>

development:
  <<: *default
  database: test

test:
  <<: *default
  database: test

production:
  <<: *default

相关的本地依赖关系:

activerecord (5.1.4)
mysql2 (0.4.10)
rails (5.1.4)

AWS安全组:

default (<group_id>)    CIDR/IP - Inbound   0.0.0.0/0
default (<group_id>)    CIDR/IP - Outbound  0.0.0.0/0
Publicly accessible: Yes

我们尝试了什么:

  • 重新启动MySQL服务器:$ brew services list $ brew services restart mysql
  • 在AWS上查看MySQL日志,显示错误:[Warning] IP address '<ip_address>' could not be resolved: Name or service not known
  • 在生产中进行测试,在尝试连接数据库时,会出现错误:ActiveRecord::StatementInvalid: Mysql2::Error: No database selected
  • 运行rake db:create RAILS_ENV=development,其中包含错误: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.`<possibly_private_id>`.`us-east-1`.`rds`.`amazonaws`.`com` DEFAULT CHARACTER SET `utf8`' at line 1
  • 卸载mysql,/ usr / local / var / mysql,然后重新安装mysql(通过brew)
  • 检查ENV变量,其中没有与MySQL有关的变量。
  • 通过运行mysql.server status
  • 确认我的mysql服务器正在运行

我有一个理论认为,在安装gem dotenv-rails时,我们可能丢失了一些MySQL凭据,这些凭据允许从我们项目的本地目录访问服务器......再一次,我们仍然可以连接到服务器通过MySQL CLI,我们知道AWS上的一切都很好而且健康。我似乎也无法以我的本地用户名 root登录到mysql。目前正试图解决这个问题。

1 个答案:

答案 0 :(得分:0)

解决 - 结果证明它与我在环境变量设置中所做的修改有关。 Rails指南的In this section,它指出特别声明&#34; DATABASE_URL&#34;作为环境变量自动设置或覆盖config / database.yml文件中声明的database变量。

就我而言,host变量(在config / database.yml中设置)已正确设置为MY_DATABASE_NAME.amazon.aws,但我环境中的DATABASE_URL变量正在静默设置配置文件&# 39; s database变量为MY_DATABASE_NAME.amazon.aws

我没有名为&#39; MY_DATABASE_NAME.amazon.aws&#39;的数据库,这就是为什么它吓坏了。希望这有助于其他人!