Rails运行rake任务报root@localhost MySQL无密码访问拒绝如何解决?
排查解决步骤
- 先验证127.0.0.1对应的root账号权限
MySQL中localhost(走本地socket连接)和127.0.0.1(走TCP连接)是两个独立的账号权限体系,你之前终端直接执行mysql默认走的是localhost的账号权限,和Rails配置里默认的127.0.0.1不一致。在终端执行如下命令测试:
如果该命令连接失败,说明mysql -h 127.0.0.1 -u rootroot@127.0.0.1账号没有配置无密码访问权限,要么给该账号授权,要么把database.yml里的host改为localhost即可。 - 检查Rails运行环境的变量配置
你的database.yml大量使用环境变量作为默认值的兜底,有可能运行rake任务的shell环境下存在不符合预期的变量覆盖:- 检查项目根目录下是否存在
.env、.env.development这类配置文件,看里面的DATABASE_MYSQL_HOST、DATABASE_MYSQL_PASSWORD等值是否配置正确 - 可以在
recognize.rake的init任务开头加一行打印代码,确认实际加载的配置:
运行rake任务后查看输出,和你本地可用的MySQL连接参数对比即可找到差异。puts "加载的数据库配置:host=#{ENV['DATABASE_MYSQL_HOST'] || '127.0.0.1'}, username=#{ENV['DATABASE_MYSQL_USERNAME'] || 'root'}, password=#{ENV['DATABASE_MYSQL_PASSWORD'] || ''}" - 检查项目根目录下是否存在
- 本地直连测试定位问题
进入Rails控制台执行代码直接测试连接,排除配置覆写问题:
如果测试成功,直接把对应参数写死到# 执行 rails c 进入控制台后运行 require "mysql2" # 把下面参数替换成你终端能正常连接MySQL的参数 client = Mysql2::Client.new(host: "localhost", username: "root", password: "你的密码(如果有)") puts "连接测试成功"database.yml的development配置块即可临时解决问题,后续再排查环境变量的覆盖问题。 - 检查是否有其他配置覆写
查看config/initializers目录下是否有数据库相关的初始化文件,这类文件会在Rails启动时加载,有可能覆盖database.yml的配置。
内容的提问来源于stack exchange,提问作者Afolabi Olaoluwa
相关产品推荐
相关产品推荐

