Rails生产环境下Trilogy无法连接远程MySQL但mysql2可正常连接
问题分析与解决方案
你的核心问题是Trilogy适配器在同时配置host和socket时,会优先使用socket建立本地连接,导致本应连接远程DB_IP_ADDR的primary数据库,实际尝试用本地socket连接,触发了'us'@'localhost'的权限验证,而该用户并无远程数据库的访问权限,因此报错。
具体修复步骤
- 移除
production.primary配置中的socket参数:远程数据库连接不需要本地socket,Trilogy在同时存在host和socket时,会优先选择socket连接,这和mysql2的行为存在差异。 - 修正
cache配置中的拼写错误:endoding应为encoding,避免后续可能出现的编码问题。
修改后的config/database.yml示例:
production: primary: adapter: trilogy database: remote_production_db host: DB_IP_ADDR username: us password: password encoding: utf8 cache: adapter: trilogy database: our_solid_cache_db host: 127.0.0.1 username: us password: cache_password socket: /var/run/mysqld/mysqld.sock encoding: utf8 migrations_paths: "db/cache/migrate"
额外验证点
- 确认远程MySQL服务器的防火墙/安全组已开放3306端口给
PRODUCTION_IP_ADDR(既然mysql2能正常连接,这一步大概率没问题,但可快速排查)。 - 再次确认远程MySQL的
'us'@'PRODUCTION_IP_ADDR'用户权限已正确配置并刷新:
# 在DB_IP_ADDR执行 mysql> SHOW GRANTS FOR 'us'@'PRODUCTION_IP_ADDR';
内容的提问来源于stack exchange,提问作者nimmolo
相关产品推荐
相关产品推荐

