返回

Rails 应用程序连接远程 MySQL 数据库时连接不上,怎么破?

mysql

使用 Trilogy 适配器连接 Rails 应用程序到远程 MySQL 数据库

导言

在构建 Rails 应用程序时,连接到数据库是至关重要的。随着应用程序的增长,将数据库迁移到远程服务器变得十分必要,以处理增加的负载。本篇文章将重点介绍在将 Rails 7.1.3 生产服务器的数据库适配器从 mysql2 切换到 trilogy 时如何克服与远程 MySQL 数据库连接相关的挑战。

问题

在尝试连接 Rails 应用程序到远程 MySQL 数据库时,我遇到了一个奇怪的问题。本地缓存数据库连接正常,但我无法建立到远程服务器的连接。这是我在调试过程中遇到的错误消息:

ActiveRecord::ConnectionNotEstablished:
Failed to establish a connection with the database. Please check your
configuration and ensure that the database server is running.

调查

起初,我怀疑是 Rails 应用程序的配置问题。然而,经过仔细检查后,我发现配置设置是正确的。我接下来查看了 Trilogy 适配器的文档,发现它目前不支持 MySQL 8 的 caching_sha2_password 身份验证方法。

解决方案

为了解决这个问题,我需要将远程 MySQL 数据库的身份验证方法从 caching_sha2_password 更改为 mysql_native_password。我使用以下命令在 MySQL 控制台中进行了更改:

ALTER USER 'us'@'PRODUCTION_IP_ADDR' IDENTIFIED WITH mysql_native_password BY 'password';

完成更改后,我重新启动了 MySQL 服务以应用更改。然后,我在 Rails 应用程序的 config/database.yml 文件中更新了数据库配置,使用了正确的身份验证方法和凭据:

production:
  primary:
    adapter:  trilogy
    database: remote_production_db
    host:     DB_IP_ADDR
    username: us
    password: password
    socket:   /var/run/mysqld/mysqld.sock
    encoding: utf8

反思

现在 Rails 应用程序可以成功连接到远程 MySQL 数据库。我意识到此问题是由于 Trilogy 适配器不支持 caching_sha2_password 身份验证方法造成的。通过将身份验证方法更改为 mysql_native_password,我能够解决这个问题,并确保应用程序的数据库连接稳定。

常见问题解答

  • 为什么需要更改身份验证方法?

Trilogy 适配器不支持 MySQL 8 的 caching_sha2_password 身份验证方法。

  • 如何更改身份验证方法?

使用 ALTER USER 命令在 MySQL 控制台中进行更改。

  • 更改身份验证方法后需要做什么?

重新启动 MySQL 服务以应用更改。

  • 如何更新 Rails 应用程序的数据库配置?

config/database.yml 文件中更新数据库配置,使用正确的身份验证方法和凭据。

  • 如果仍然无法连接到数据库该怎么办?

检查防火墙规则并确保允许从 Rails 服务器到远程 MySQL 数据库的连接。