Mysql 1045 access denied for user

При подключении к 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.

Не указан хост в явном виде

Возможно при создании пользователя не был указан хост:

CREATE USER 'user' IDENTIFIED BY 'pass'

# Проблема также может появиться при выдаче прав GRANT ALL

В этом случае будет создан пользователь 'user'@'%', а при попытке подключения локально появится ошибка, так как пользователя 'user'@'localhost' не существует.

Использование кавычек

Еще одна неявная причина ошибки — неправильное использование кавычек:

CREATE USER 'user@localhost' IDENTIFIED BY 'somepass'

# Будет создан пользователь 'user@localhost'@'%'

Анонимный (пустой) пользователь

Наличие “пустого” пользователя ''@'localhost' или ''@'127.0.0.1' — самая неочевидная причина проблемы. При подключении к БД, сервер в первую очередь проверяет пользователей с явно указанными IP-адресом или localhost-ом, проверяя по таблице mysql.user. То есть, система попробует подключить пользователя 'user'@'localhost', проверяя пользователя ''@'localhost'. В этом случае и появится ошибка 1045: Access denied for user. Лучшим решением проблемы будет удаление анонимного юзера:

shell> mysql -u root -p
Enter password: (enter root password here)
mysql> DROP USER ''@'localhost';
mysql> DROP USER ''@'host_name';

# Не забудьте указать свой хост

Пароль утерян

Если же ошибок нет и вы уверены, что имя пользователя верное, тогда единственное решение — смена пароля:

shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('new_password')
    ->     WHERE User = 'user';
mysql> FLUSH PRIVILEGES;

# Подключение под суперпользователем, обновление таблицы mysql.user

Если же утерян пароль суперпользователя, то нужно выполнить следующее:

 # Остановка сервера MySQL
/etc/init.d/mysqld stop

 # Перезапуск, пропускает таблицу привилегий
mysqld_safe --skip-grant-tables

 # Запуск нового клиента (в новом терминале)
mysql -u root

 # Сброс пароля
UPDATE mysql.user SET authentication_string=PASSWORD('password')  WHERE  User='root';

FLUSH PRIVILEGES;

# Установка нового root-пароля и обновление привилегий

Самое главное

Главная причина ошибки — несоответствие имени пользователя, хоста и пароля. Так что проверяйте учетные данные, отключайте анонимного пользователя и не используйте root для удаленного подключения.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень