Ошибка MySQL Access denied означает, что сервер доступен, но не принимает сочетание пользователя, источника подключения и способа аутентификации. Смена пароля помогает не всегда: учетные записи user@localhost и user@127.0.0.1 для MySQL различаются.
Зафиксируйте полный текст ошибки, host и порт. Проверьте вход теми же параметрами из того же окружения, где работает приложение, а затем сравните учетные записи и выданные права.
Коротко: что сделать
- Скопировать полный код и user@host из ошибки
- Проверить host, port и socket
- Проверить наличие нужной учетной записи в mysql.user
- Посмотреть SHOW GRANTS
- Проверить пароль и auth plugin без вывода секрета в лог
Почему возникает проблема
MySQL выбирает учетную запись по имени и источнику подключения. Поэтому локальный вход администратора не доказывает, что приложение имеет доступ.
- Пользователь создан только для localhost
- Приложение подключается к другому порту или экземпляру MySQL
- Пароль в переменной окружения устарел
- Учетной записи не выданы права на нужную базу
- Драйвер не поддерживает текущий auth plugin
- В пароле есть символы, неверно обработанные конфигурацией
Пошаговая диагностика
Проверку лучше проводить на одном воспроизводимом примере и фиксировать результат каждого шага. Так можно быстро отделить первопричину от побочных ошибок и не менять несколько компонентов одновременно.
- Выполнить mysql -h HOST -P PORT -u USER -p из окружения приложения
- Проверить SELECT User, Host, plugin FROM mysql.user
- Выполнить SHOW GRANTS FOR соответствующей записи
- Сравнить DSN приложения с рабочим ручным подключением
- Проверить секрет в systemd, Docker или панели без публикации значения
- Просмотреть MySQL log на причину отказа
Как исправить
Создавайте или изменяйте точную учетную запись для нужного источника и выдавайте минимальные права только на рабочую базу.
- Исправить host и port в DSN
- Обновить пароль в защищенном хранилище конфигурации
- Создать user@host с подходящим auth plugin
- Выдать SELECT, INSERT, UPDATE и другие реально необходимые права
- Перезапустить процесс приложения после изменения переменных окружения
- Удалить временные широкие права после проверки
Как проверить результат
- Подключиться от имени приложения
- Выполнить безопасный SELECT к нужной таблице
- Проверить запись в тестовой транзакции, если она требуется
- Убедиться, что чужие базы недоступны
- Проверить журнал приложения после перезапуска
Как не допустить повторения
Доступ к базе следует описывать как конфигурацию с отдельными учетными записями для приложений и окружений.
- Не использовать root в приложении
- Разделить пользователей production и test
- Хранить секреты вне репозитория
- Документировать host, port и минимальные GRANT
Чего не стоит делать
- Не выдавать GRANT ALL ON *.* ради быстрой проверки
- Не отключать аутентификацию MySQL
- Не писать пароль в командную историю и публичные логи
- Не менять auth plugin у всех пользователей сразу
Что подготовить для диагностики
- Полный текст Access denied
- DSN без пароля
- Версия MySQL и драйвера
- SHOW GRANTS проблемного пользователя
- Схема запуска приложения
Частые вопросы
Почему localhost работает, а 127.0.0.1 нет?
localhost может использовать Unix socket и другую запись user@host, а 127.0.0.1 — TCP.
Нужно ли выполнять FLUSH PRIVILEGES?
После CREATE USER и GRANT обычно нет. Он нужен при ручном изменении системных таблиц, чего лучше не делать.
Почему пароль верный, но доступ запрещен?
Может быть выбрана другая запись user@host, другой сервер, порт или неподдерживаемый плагин аутентификации.
Когда стоит обратиться за помощью
Обратитесь за помощью, если на сервере несколько MySQL, приложение работает в контейнере, права нужно изменить без остановки продакшена или есть риск открыть базу наружу.
Итог
Access denied исправляется проверкой точного маршрута подключения, учетной записи user@host и минимальных прав. Настроить безопасный доступ MySQL и PDO можно через @rabotator_support.