Thank you for reading this post, don't forget to subscribe!
При подключении к MySQL, ERROR 1045 (28000): Access denied for user означает неверную комбинацию имени пользователя и/или хоста и/или пароля. Причин возникновения несколько.
Localhost и 127.0.0.1
Если вы уверены, что введенная комбинация пользователь/пароль верна, то следующим шагом будет проверка адреса. Localhost соответствует IP-адресу 127.0.0.1, а пользователи 'user'@'127.0.0.1' и 'user'@'localhost' взаимозаменяемы. Вот только для каждого из них можно задать отдельный пароль, а при входе будет выбираться пользователь, который находится выше в таблице mysql.user.
Не указан хост в явном виде
Возможно при создании пользователя не был указан хост:
1 |
CREATE USER 'user' IDENTIFIED BY 'pass' |
# Проблема также может появиться при выдаче прав GRANT ALL
В этом случае будет создан пользователь 'user'@'%', а при попытке подключения локально появится ошибка, так как пользователя 'user'@'localhost' не существует.
Использование кавычек
Еще одна неявная причина ошибки — неправильное использование кавычек:
1 |
CREATE USER <b>'user@localhost'</b> IDENTIFIED BY 'somepass' |
# Будет создан пользователь 'user@localhost'@'%'
Анонимный (пустой) пользователь
Наличие “пустого” пользователя ''@'localhost' или ''@'127.0.0.1' — самая неочевидная причина проблемы. При подключении к БД, сервер в первую очередь проверяет пользователей с явно указанными IP-адресом или localhost-ом, проверяя по таблице mysql.user. То есть, система попробует подключить пользователя 'user'@'localhost', проверяя пользователя ''@'localhost'. В этом случае и появится ошибка 1045: Access denied for user. Лучшим решением проблемы будет удаление анонимного юзера:
1 2 3 4 |
shell> mysql -u root -p Enter password: (enter root password here) mysql> DROP USER ''@'localhost'; mysql> DROP USER ''@'<b>host_name</b>'; |
# Не забудьте указать свой хост
Пароль утерян
Если же ошибок нет и вы уверены, что имя пользователя верное, тогда единственное решение — смена пароля:
1 2 3 4 |
shell> <b>mysql -u root</b> mysql> UPDATE mysql.user SET Password = PASSWORD('new_password') -> WHERE User = 'user'; mysql> FLUSH PRIVILEGES; |
# Подключение под суперпользователем, обновление таблицы mysql.user
Если же утерян пароль суперпользователя, то нужно выполнить следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Остановка сервера MySQL /etc/init.d/mysqld stop <span class="comment"> # Перезапуск, пропускает таблицу привилегий </span>mysqld_safe --skip-grant-tables <span class="comment"> # Запуск нового клиента (в новом терминале) </span>mysql -u root <span class="comment"> # Сброс пароля </span>UPDATE mysql.user SET authentication_string=PASSWORD('password') WHERE User='root'; FLUSH PRIVILEGES; |
# Установка нового root-пароля и обновление привилегий
Главная причина ошибки — несоответствие имени пользователя, хоста и пароля. Так что проверяйте учетные данные, отключайте анонимного пользователя и не используйте root для удаленного подключения.