#Что означает неисправность и в каких условиях возникает
После смены пароля пользователя приложения появляется ERROR 1045 (28000): Access denied for user ... (using password: YES). Это не обязательно неверный новый пароль: приложение может подключаться как другая пара user@host, использовать старый файл настроек или несовместимый клиент. Сначала проверьте вход непосредственно с того же узла и тем же способом, что использует приложение. Изменение пароля на сервере без синхронизации с клиентами может одновременно остановить несколько сервисов.
#Возможные причины: как различить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Остался старый секрет в конфигурацииОдин из контейнеров, фоновых работников или секретных хранилищ не обновился. | mysql -p вручную проходит, а конкретный сервис по-прежнему выдаёт 1045. | Найти действующий источник пароля без записи секрета в журнал. |
| Подключение к другому user@hostДля localhost и удалённого IP у MySQL могут быть разные записи. | Ошибка показывает не тот Host, который ожидался. | Сверить точный адрес клиента и учётную запись. |
| Учётная запись блокирована или изменён способ входаПосле ротации могли смениться плагин аутентификации или состояние учётной записи. | Проверки администратора показывают lock или другой плагин. | Согласовать восстановление именно нужной учётной записи. |
#Пошаговая диагностика и устранение
- Зафиксируйте безопасные признакиСкопируйте только номер ошибки, имя учётной записи, видимый клиентский Host и время в служебную заявку. Не прикладывайте полные строки подключения, секреты и файлы .env. Убедитесь, что сервис действительно подключается к нужному экземпляру MySQL, а не к резервному серверу со старым паролем.
- Подключитесь вручную с узла приложенияНа той же машине, где работает сайт, откройте терминал через SSH. Запустите
mysql -h 127.0.0.1 -u app_user -p, заменивapp_userи адрес; параметр-pбез значения запросит пароль интерактивно и не оставит его в истории команд. Если приложение использует Unix-сокет и localhost, выполните отдельную проверкуmysql -h localhost -u app_user -p: это разные способы соединения. - Сравните ожидаемую и фактическую пару user@hostПри успешном подключении запустите
SELECT USER(), CURRENT_USER();: USER() показывает переданные клиентом имя/узел, CURRENT_USER() — запись, по которой сервер выполнил аутентификацию. Если подключение не прошло, администратор должен посмотреть записиmysql.userдля указанного имени с безопасного административного доступа. - Проверьте единственный действующий источник настроекВ приложении найдите конфигурацию подключения: переменные окружения, секреты панели, контейнерный файл, настройки фонового обработчика. Сверьте адрес, порт и имя пользователя с ручным тестом. Не выводите пароль через
echo,phpinfo()или на веб-страницу; при исправлении секрета используйте обычный механизм загрузки защищённых переменных и корректный перезапуск только приложения. - Проверьте состояние записи у администратораВ административной сессии выполните
SELECT User,Host,plugin,account_locked FROM mysql.user WHERE User='app_user';, заменив имя.account_lockedпоказывает, заблокирована ли учётная запись. При отсутствии права SELECT попросите DBA; предоставлять доступ к mysql.user веб-приложению нельзя. После обновлений 8.4 учитывайте, что устаревший mysql_native_password может быть недоступен по умолчанию. - Восстановите корректный пароль контролируемоЕсли причина в ошибочной ротации, администратор должен изменить секрет через принятый механизм, синхронно обновить зависимые приложения и проверить вход перед распространением. В production не задавайте общие пароли и не передавайте их в SQL-команде через общий чат. План отката — восстановить предыдущий секрет из защищённого хранилища, если это разрешает политика, а затем повторно проверить все службы.
- Перепроверьте доступ без расширения привилегийПосле устранения 1045 в ручном сеансе введите
SELECT 1;— должна появиться строка с числом 1. Затем откройте страницу сайта и фоновое задание, которым нужен доступ к БД. Нельзя исправлять 1045 выдачей ALL PRIVILEGES или удалением пароля; такие действия увеличивают риск и не гарантируют устранения причины. - Обработайте остаточные сбои после ротацииЕсли ручное подключение работает, а сайт всё ещё выдаёт 1045, убедитесь, что старые PHP-FPM-работники или контейнеры перезапущены через штатный процесс развёртывания и что секрет не кешируется. Если ошибка возникает лишь с отдельного сервера, сравните исходный IP и существующую запись user@host; передайте DBA имя и адрес без содержимого секрета.
- Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Как проверить исправление и что делать, если оно не помогло
Исправление подтверждено, если клиент с тем же host и user выполняет SELECT 1, а приложение и фоновые задания больше не сообщают 1045. Если сбой остаётся только в одной среде, исследуйте источник секретов и совпадение пользователь/узел; для отката восстановите согласованную предыдущую конфигурацию доступа, а не права на всю БД.