【问题标题】:Rails app denied access to mysql for user root @ localhostRails 应用程序拒绝用户 root @ localhost 访问 mysql
【发布时间】:2020-10-26 22:40:42
【问题描述】:

我正在运行 Linux Ubuntu 18.04.5、mysql 服务器版本 5.7.31 和 Rails 6.0.3.4

我使用rails new classic_models -d mysql -T 制作了我的新应用

这是它为我生成的database.yml 文件:

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /var/run/mysqld/mysqld.sock

development:
  <<: *default
  database: classic_models_development

test:
  <<: *default
  database: classic_models_test

production:
  <<: *default
  database: classic_models_production
  username: classic_models
  password: <%= ENV['CLASSIC_MODELS_DATABASE_PASSWORD'] %>

当我运行bundle exec rails db:createrails db:create 和其他db: 命令时,我收到此错误:

Access denied for user 'root'@'localhost'
Couldn't create 'classic_models_development' database. Please check your configuration.
rails aborted!
Mysql2::Error: Access denied for user 'root'@'localhost'

我认为配置文件没有为开发数据库指定密码是可以的,因为当我运行sudo mysql -p 时,我只需在提示我输入密码时按 ENTER 即可访问 mysql 提示符。而且我还运行了一些其他命令来将密码显式设置为空字符串,以确保这不是问题。

我尝试将host: localhost 添加到配置文件的默认部分,但这并没有改变任何东西。我也尝试将host: 127.0.0.1 添加到配置文件中,但这也没有帮助。

当我运行sudo mysqladmin variables | grep socket 时,显示的套接字字符串是:/var/run/mysqld/mysqld.sock,我认为这意味着配置文件的套接字位是正确的。

当我运行netstat -an | grep 3306 时,地址127.0.0.1:3306LISTEN 都会出现,我认为这意味着它正在侦听正确的端口。

我能想到的唯一其他可能相关的事情是,当我运行 mysqlmysql -p 而前面没有 sudo 时,我得到的错误包含相同的字符串: Access denied for user 'root'@'localhost'

几个小时以来,我一直在梳理其他线程关于这里听起来像是同一问题的问题,尝试不同的事情,但还没有找到解决方案。请不要将此问题标记为重复问题并链接到任何其他页面。

如果有人能提出其他我可以尝试的建议,我将非常感激。

【问题讨论】:

    标签: mysql ruby-on-rails


    【解决方案1】:

    你必须先在 mysql 中为 root 用户设置密码。为此,请按照以下步骤操作。

    第 1 步:以 root 用户登录 MySQL。当 mysql 将要求输入密码时,只需按 enter。

    $ sudo mysql -u root -p
    

    第 2 步:为 root 用户设置密码。请用您想要的密码替换NewPassword。设置此命令后请按照步骤 1 进行,当系统询问密码时,请输入您的新密码并回车。

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
    

    第 3 步:在您的 database.yml 文件中使用此密码。

    # config/database.yml
    
    default: &default
      adapter: mysql2
      encoding: utf8mb4
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      username: root
      password: NewPassword
      socket: /var/run/mysqld/mysqld.sock
    
    development:
      <<: *default
      database: classic_models_development
    
    test:
      <<: *default
      database: classic_models_test
    
    production:
      <<: *default
      database: classic_models_production
      username: classic_models
      password: <%= ENV['CLASSIC_MODELS_DATABASE_PASSWORD'] %>
    

    我认为这会对您有所帮助。谢谢:-)

    【讨论】:

    • 嗨,这不起作用。我按照这些步骤操作,但是当我尝试运行“rails db:create”时,仍然收到“用户'root'@'localhost'的访问被拒绝”错误。我确保将文件中的密码设置为我在查询中输入的相同字符串。我还确保在运行查询后离开 mysql 提示符并使用我的新密码重新登录。我注意到,当我在 mysql 提示符下运行“ALTER USER [...]”查询时,结果是:“查询正常,0 行受影响(0.00 秒)”。这是否意味着什么都没发生?我仍然可以在没有密码的情况下(以及使用新密码)登录 mysql 提示符。
    • 您好,您可以卸载mysql并重新安装。然后按照步骤操作。
    • 我卸载了mysql,重新安装,安装时设置了root密码,安装完成后发现一切正常,我在Rails文件中设置了新密码。在第一次安装 mysql 期间(或者当我随后尝试在 mysql 提示符中将密码设置为空字符串时)我一定做错了什么。不管是什么问题,现在都过去了。非常感谢您的帮助。
    • 我很乐意为您提供帮助。 :)
    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2020-11-13
    • 2020-02-04
    • 2013-07-28
    • 2023-03-20
    相关资源
    最近更新 更多