【问题标题】:ActiveRecord NoDatabaseError when attempting to connect to AWS MySQL instance尝试连接到 AWS MySQL 实例时出现 ActiveRecord NoDatabaseError
【发布时间】:2018-02-19 19:36:00
【问题描述】:

我们之前通过 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 '&lt;ip_address&gt;' 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 '.`&lt;possibly_private_id&gt;`.`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。目前正试图解决这个问题。

【问题讨论】:

  • 它实际上是在寻找'&lt;database_name&gt;.us-east-1.rds.amazonaws.com' -> 它从哪里得到database_name?我注意到开发/测试环境说 database: test 而 prod 没有定义一个......这相关吗?是否有未添加到 .env 的相关环境变量? heroku 往往有神奇的、动态创建的 ENV 变量——它可能是其中之一......

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


【解决方案1】:

已解决 - 原来这与我在环境变量设置中所做的修改有关。 Rails 指南的In this section,它指出,特别将“DATABASE_URL”声明为环境变量自动设置或覆盖在您的 config/database.yml 文件中声明的database 变量。

在我的例子中,host 变量(在 config/database.yml 中设置)被正确设置为 MY_DATABASE_NAME.amazon.aws,但我的环境中的 DATABASE_URL 变量默默地将配置文件的 database 变量设置为相同MY_DATABASE_NAME.amazon.aws.

我没有名为“MY_DATABASE_NAME.amazon.aws”的数据库,这就是它吓坏了的原因。希望这对其他人有帮助!

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多