#Расшифровка
ERROR 1045 (28000): Access denied for user 'app'@'localhost' (using password: YES)
В MySQL учётная запись — это пара «имя + хост», например 'app'@'localhost'. Пользователи 'app'@'localhost' и 'app'@'%' — разные записи с разными паролями и правами. Поэтому ошибка зависит и от того, откуда вы подключаетесь.
#Что проверить сначала
- Хост в сообщении: подключение идёт с
localhost,127.0.0.1или внешнего адреса? Для сокета и TCP применяются разные записи. using password: NO— пароль не был передан (пустой в конфиге приложения).using password: YES— пароль передан, но не подошёл или нет записи для этого хоста.
#Пошаговое решение для новичка
- Определите, какой пользователь подключаетсяВ сообщении
ERROR 1045 (28000)найдите пользователя, указанный хост и пометкуusing password. Проверьте настройки приложения и определите, используется ли Unix-сокет (localhost) или TCP (127.0.0.1либо отдельный сервер). Сохраните резервную копию конфигурации, скрыв пароль от посторонних. - Проверьте доступ, не раскрывая парольВ терминале на сервере приложения выполните
mysql -h ИМЯ_СЕРВЕРА -u ИМЯ_ПОЛЬЗОВАТЕЛЯ -p ИМЯ_БАЗЫ -e "SELECT 1". После-pпароль вводится скрытно по запросу. Если тест работает, сравните настройки приложения и действующий хост; если нет, сохраните точное сообщение MySQL. - Сверьте учётную запись и привилегииАдминистратор БД входит своим штатным способом и проверяет существование пары
user+host, способ аутентификации и права только для нужной базы. В MySQL 8/9 следует использовать поддерживаемый механизм аутентификации и обновлённый клиент; старыйmysql_native_passwordудалён в MySQL 9.0 и его нельзя предлагать как универсальное решение. - Исправьте только подтверждённую причинуПосле резервной копии и согласования восстановите нужный пароль учётной записи либо необходимые минимальные права для конкретной базы. Не выдавайте
GRANT ALLв надежде устранить любую ошибку и не меняйте парольrootбез процедуры восстановления. Повторите тест подключения и запрос приложения, затем проверьте журнал ошибок.
#Способ 1. Войдите администратором и посмотрите учётные записи
mysql -u root -p.sudo mysqlapp замените на своё.SELECT user, host, plugin FROM mysql.user WHERE user = 'app';SHOW GRANTS FOR 'app'@'localhost';#Способ 2. Создайте пользователя или задайте пароль
appdb. Не выдавайте *.* приложениям без необходимости. Пароль подставьте свой.-- Пример для администратора БД, только после проверки имени БД и прав:CREATE USER IF NOT EXISTS 'app'@'localhost' IDENTIFIED BY 'ЗАДАЙТЕ_СВОЙ_СЛОЖНЫЙ_ПАРОЛЬ';GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'localhost';-- Добавляйте иные права лишь если их требует приложение.-- Существующему пользователю пароль эта команда CREATE USER не меняет.Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
ALTER USER 'app'@'localhost' IDENTIFIED BY 'новый-надёжный-пароль';Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Способ 3. Проверьте плагин аутентификации
Клиентам, не поддерживающим современную аутентификацию MySQL, требуется обновление драйвера/библиотеки и проверка конфигурации TLS. Плагин mysql_native_password в MySQL 8.4 отключён по умолчанию, в MySQL 9.0 удалён: не переключайте пользователя на него вслепую. Перед изменением учётной записи проверьте версию сервера и поддержку клиентом действующего плагина.
-- НЕ применяйте mysql_native_password на современных выпусках MySQL.-- Обновите устаревший драйвер; проверьте действующий плагин:SELECT user, host, plugin FROM mysql.user WHERE user = 'app';Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Способ 4. Проверьте конфигурацию приложения
- Сверьте имя пользователя, хост и порт:
localhostи127.0.0.1могут использовать разные способы подключения. - Убедитесь, что в пароле нет спецсимволов, которые ломают строку подключения (используйте кодирование или экранирование).
- Проверьте, не подменяются ли значения переменными окружения.
#Как проверить результат
1. Пароль будет запрошен интерактивно.mysql -u app -p -h localhost -e 'SELECT 1'