#Что означает ошибка
Access denied for user
Ошибка ERROR 1045 (28000): Access denied for user сообщает, что MySQL отклонил попытку входа. Это решение принимает сам сервер: он проверяет сочетание «пользователь + хост, с которого идёт подключение + пароль». Учётные записи в MySQL привязаны к хосту, поэтому root@localhost и root@% — это разные пользователи с разными паролями.
Слова «using password: YES» говорят, что пароль передавался, но не подошёл; «using password: NO» — что пароль не был передан вовсе (например, он не прописан в конфиге приложения). Эта деталь сразу показывает, где искать ошибку.
Проверьте пароль, хост пользователя и привилегии.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| ПарольНеверный. | Проявляется как «Access denied for user» или близкий по смыслу сбой. | Смените. |
| Хостlocalhost. | Проявляется как «Access denied for user» или близкий по смыслу сбой. | %. |
| ПраваGRANT. | Проявляется как «Access denied for user» или близкий по смыслу сбой. | Выдайте. |
| Плагинauth. | Проявляется как «Access denied for user» или близкий по смыслу сбой. | Измените. |
#Пошаговое решение
- Проверьте, что именно отклоненоСохраните полную строку ошибки
Access denied for user 'имя'@'хост' (using password: YES/NO)из клиента и определите, какой адрес/учётная запись реально отклонены. В MySQL пользователиapp@localhostиapp@%— разные учётные записи; не меняйте пароль root, если ошибка у приложения. - Проверьте учётную записьАдминистратор MySQL входит через предусмотренный способ (
sudo mysqlна некоторых локальных установках или защищённая административная учётная запись) и выполняетSELECT user,host,plugin FROM mysql.user WHERE user="app";, подставив имя. Проверьте, не отсутствует ли запись для нужного хоста и не устарел ли метод аутентификации. - Задайте пароль и праваЕсли требуется отдельная учётная запись приложения, создайте её с надёжным уникальным паролем через
CREATE USERи предоставьте только необходимые права на конкретную базу (GRANT SELECT,INSERT,UPDATE,DELETE ...или нужные проекту права), после согласования. Не назначайтеGRANT ALLпо шаблону на весь сервер; если аккаунт уже есть, не меняйте ему пароль без синхронного обновления приложения. - Проверьте подключение из приложенияВ конфигурации приложения проверьте хост (
localhostчасто означает сокет,127.0.0.1— TCP), имя БД и пользователя. Выполните безопасныйmysql -h фактический_хост -u фактический_пользователь -p -e "SELECT 1", затем повторите запрос приложения. Не оставляйте пароль в истории команд или в общедоступном PHP-файле. - Если забыт пароль rootЕсли утерян административный пароль MySQL, используйте официальную процедуру восстановления для конкретной версии и платформы только через консоль с гарантированной изоляцией. Не запускайте
--skip-grant-tablesна доступной из сети БД и не переключайте всех пользователей на устаревшийmysql_native_password: в MySQL 8.4 он отключён по умолчанию, а в 9.0 удалён.
#Проверка пользователя и хоста
Зайдите под администратором и выполните SELECT user, host, plugin FROM mysql.user. Убедитесь, что запись для нужного пользователя существует и что хост совпадает с тем, откуда подключается клиент (localhost, 127.0.0.1, IP или %). Подключение к localhost по сокету и к 127.0.0.1 по TCP обрабатываются как разные хосты.
#Плагин аутентификации и пароль
В MySQL 8 по умолчанию используется caching_sha2_password, а старые клиенты и драйверы PHP его не понимают. Если приложению нужен mysql_native_password, измените способ входа для пользователя. Для сброса забытого пароля root запустите сервер с пропуском таблиц привилегий, задайте новый пароль и перезапустите сервер в обычном режиме.
#Права на базу
Даже после успешного входа пользователь может получить отказ, если у него нет прав на конкретную базу. Выдайте их командой GRANT и примените FLUSH PRIVILEGES. Для приложений создавайте отдельного пользователя с правами только на нужную базу, а не используйте root.
SELECT user,host,plugin FROM mysql.user WHERE user='app';-- Создание и GRANT выполняйте только после определения реального аккаунта и минимально необходимых прав.Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
SELECT user, host, plugin FROM mysql.user;