【发布时间】: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 '<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。目前正试图解决这个问题。
【问题讨论】:
-
它实际上是在寻找
'<database_name>.us-east-1.rds.amazonaws.com'-> 它从哪里得到database_name?我注意到开发/测试环境说database: test而 prod 没有定义一个......这相关吗?是否有未添加到.env的相关环境变量? heroku 往往有神奇的、动态创建的 ENV 变量——它可能是其中之一......
标签: mysql ruby-on-rails amazon-web-services activerecord