Приложению Rails отказано в доступе к mysql для пользователя root @ localhost

#mysql #ruby-on-rails

#mysql #ruby-on-rails

Вопрос:

Я использую Linux Ubuntu 18.04.5, сервер mysql версии 5.7.31 и Rails 6.0.3.4

Я создал свое новое приложение с rails new classic_models -d mysql -T

Это database.yml файл, который он сгенерировал для меня:

 default: amp;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:create rails 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 я могу получить доступ к приглашению mysql, просто нажав ENTER, когда он запрашивает у меня пароль. И я также выполнил несколько других команд, чтобы явно установить пароль в пустую строку, просто чтобы убедиться, что это не проблема.

Я попытался добавить 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:3306 , и он появляется, что LISTEN , я думаю, означает, что он прослушивает правильный порт.

Единственная другая, возможно, важная вещь, которую я могу упомянуть, это то, что когда я запускаю mysql или mysql -p не sudo запускаю перед ним, ошибка, которую я получаю, содержит эту же строку: Access denied for user 'root'@'localhost'

Я часами просматривал другие темы о том, что здесь звучит как одна и та же проблема, пробуя разные вещи, но не нашел решения. Пожалуйста, не помечайте этот вопрос как дубликат и не ссылайтесь ни на одну из этих других страниц.

Если кто-нибудь может предложить что-нибудь еще, что я мог бы попробовать, я был бы чрезвычайно благодарен.

Ответ №1:

сначала вы должны установить пароль для пользователя root в mysql. Для этого, пожалуйста, выполните следующие действия.

Шаг 1: войдите в MySQL с помощью пользователя root. Когда mysql запросит пароль, просто нажмите enter.

 $ sudo mysql -u root -p
  

Шаг 2: Установите пароль для пользователя root. Пожалуйста NewPassword , замените желаемый пароль. После установки этой команды, пожалуйста, выполните шаг 1, и когда система запросит пароль, пожалуйста, введите свой новый пароль и нажмите enter.

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

Шаг 3: используйте этот пароль в своем database.yml файле.

 # config/database.yml

default: amp;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'] %>
  

Я думаю, это вам поможет. Спасибо 🙂

Комментарии:

1. Привет, это не сработало. Я выполнил шаги, но все равно получаю ошибку «Доступ запрещен для пользователя root @localhost» при попытке запустить «rails db: create». Я убедился, что установил пароль в файле на ту же строку, которую я ввел в запросе. Я также убедился, что оставил приглашение mysql после выполнения вашего запроса и снова вошел в систему, используя свой новый пароль. Я заметил, что когда я запустил ваш запрос «ИЗМЕНИТЬ ПОЛЬЗОВАТЕЛЯ […]» в приглашении mysql, результатом было: «Запрос в порядке, 0 строк затронуты (0,00 сек)». Означает ли это, что ничего не произошло? Я все еще могу войти в приглашение mysql без пароля (а также с новым pw).

2. Привет, вы можете удалить mysql и установить его снова. Затем следуйте инструкциям.

3. Я удалил mysql, переустановил его, установил пароль root во время установки и обнаружил, что все работает, когда установка была завершена, и я установил новый пароль в файле Rails. Должно быть, я сделал что-то не так во время первой установки mysql (или когда я впоследствии попытался установить пароль на пустую строку в приглашении mysql). Какой бы ни была проблема, теперь она решена. Большое вам спасибо за вашу помощь.

4. Я рад вам помочь. 🙂