Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
MYSQL-ERR-1045 Linux / DevOps

MySQL Ошибка 1045 (28000): Access denied for user (using password: YES)

Обновлено: 21.08.2026  ·  Официальная база знаний

Механизм аутентификации и авторизации пользователей в MySQL

Система безопасности MySQL идентифицирует учетную запись не только по имени пользователя, но и по IP-адресу или хосту, с которого инициировано подключение (составной идентификатор 'username'@'hostname'). Системная ошибка MySQL Error 1045 (SQLSTATE 28000): «Access denied for user 'appuser'@'192.168.1.50' (using password: YES)» возникает в следующих случаях:

  • Неверный пароль или несовпадение хоста: Пользователь существует для хоста 'appuser'@'localhost', но подключение выполняется по сети с внешнего IP, для которого учетная запись не заведена ('appuser'@'%').
  • Конфликт плагинов аутентификации: В MySQL 8.0 по умолчанию используется плагин caching_sha2_password, который не поддерживается старыми клиентами или библиотеками (PHP PDO 7.1, старые драйверы), требующими mysql_native_password.
  • Использование unix_socket плагина: Пользователь root по умолчанию настроен на авторизацию через сокет операционной системы (auth_socket), что запрещает вход по паролю через TCP.

Бизнес-риски

Полный сбой подключения микросервисов к базе данных, остановка бэкапов и автоматических скриптов обслуживания.

Сравнение методов аутентификации в MySQL 8.0

Плагин аутентификацииБезопасностьСовместимость с клиентами
caching_sha2_passwordВысокая (SHA-256 + кэширование хешей).MySQL 8.0+, PHP 7.4+, современные драйверы.
mysql_native_passwordСредняя (двойной SHA-1).Абсолютная совместимость со всеми легаси-клиентами.
auth_socketВысокая (доступ только локальному пользователю ОС).Локальные системные скрипты Linux / root.

Регламент сброса пароля и восстановления доступа

Сценарий 1: Коррекция хоста подключения и плагина аутентификации

Подключитесь к СУБД с правами администратора (локально через root):

# 1. Локальный вход под root:
sudo mysql

-- 2. Просмотр существующих пользователей, их хостов и плагинов:
SELECT user, host, plugin FROM mysql.user WHERE user = 'my_user';

-- 3. Создание пользователя для подключения с любого хоста (%) с совместимым плагином:
CREATE USER IF NOT EXISTS 'my_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongSecretPass123!';

-- Или смена пароля и плагина для существующего пользователя:
ALTER USER 'my_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongSecretPass123!';

-- 4. Выдача необходимых прав на базу данных:
GRANT ALL PRIVILEGES ON my_database.* TO 'my_user'@'%';
FLUSH PRIVILEGES;

Сценарий 2: Экстренный сброс пароля root через --skip-grant-tables

Если доступ к учетной записи администратора полностью утерян:

# 1. Остановите службу MySQL:
sudo systemctl stop mysql

# 2. Запустите MySQL в безопасном режиме без проверки прав:
sudo mysqld_safe --skip-grant-tables --skip-networking &

# 3. Подключитесь без пароля:
mysql -u root

-- 4. Сбросьте кэш привилегий и установите новый пароль root:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewRootPassword123!';
FLUSH PRIVILEGES;
EXIT;

# 5. Завершите аварийный процесс mysqld_safe и запустите службу в штатном режиме:
sudo killall mysqld
sudo systemctl start mysql

Сценарий 3: Проверка прав при использовании auth_socket (Ubuntu/Debian)

-- Перевод root с auth_socket на классический пароль (при необходимости):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPassword123!';
FLUSH PRIVILEGES;

Типовые ошибки администраторов

  • Попытка подключиться под 'user'@'localhost' через 127.0.0.1: В MySQL localhost означает подключение через Unix-сокет, а 127.0.0.1 — сетевое TCP-соединение. Учетная запись user@localhost не сможет войти по TCP на 127.0.0.1.
  • Забытый FLUSH PRIVILEGES: После ручной модификации системных таблиц через UPDATE mysql.user изменения не применятся до выполнения FLUSH PRIVILEGES (при использовании команд ALTER USER / GRANT сброс выполняется автоматически).
Потерян доступ к базе данных или микросервисы не могут авторизоваться?
Специалисты ITSTM безопасно восстановят права доступа, настроят RBAC-роли и приведут политики аутентификации в соответствие с требованиями безопасности.
Практический опыт инженера: Никогда не используйте суперпользователя 'root'@'%' для удаленного доступа приложений. Создавайте под каждый сервис индивидуального пользователя с минимально необходимыми привилегиями (Principle of Least Privilege) и ограничением по IP-подсети.

Частые вопросы (FAQ)

В чем разница между (using password: YES) и (using password: NO)?

YES означает, что клиент отправил пароль, но сервер отклонил его из-за несовпадения. NO означает, что клиент попытался войти вообще без передачи пароля.

Почему пользователь appuser@'%' не может войти локально?

Если в базе одновременно существует анонимный пользователь ''@'localhost' или явный 'appuser'@'localhost', MySQL отдает приоритет более специфичному хосту (localhost), а не маске %.

Как разрешить подключение пользователя только с определенной подсети?

Укажите маску подсети при создании пользователя: CREATE USER 'appuser'@'192.168.10.%' IDENTIFIED BY 'password';.

Почему PHP 7.2 выдает The server requested authentication method unknown to the client?

Старая версия PHP не поддерживает плагин caching_sha2_password. Переключите пользователя на mysql_native_password.