Ошибка 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.