mysqli::real_connect(): (HY000/1045): Access denied for user 'user'@'localhost' (using password: YES)
или:
ERROR 1045 (28000):
Access denied for user 'user'@'localhost'Вы открываете phpMyAdmin, вводите логин и пароль, но вместо списка баз данных получаете ошибку:
mysqli::real_connect(): (HY000/1045):
Access denied for user 'user'@'localhost' (using password: YES)или:
ERROR 1045 (28000):
Access denied for user 'user'@'localhost'Такая ошибка не означает, что phpMyAdmin сломан.
В большинстве случаев соединение с MySQL или MariaDB уже произошло, но сервер базы данных не разрешил авторизацию указанной учётной записи.
Проверять проблему удобно по цепочке:
phpMyAdmin → какой сервер БД → user@host → пароль → способ подключения → authentication plugin → права → config.inc.php
Главная задача — сначала определить, какая именно учётная запись пытается подключиться и к какому серверу, а уже потом менять пароли или права.
Если проблема связана с WordPress, полезно также открыть руководство об ошибке подключения WordPress к базе данных.
↑ К оглавлению1. Что на самом деле означает Access denied
MySQL рассматривает учётную запись не только как имя пользователя.
Учитывается пара:
User + HostТо есть:
'app'@'localhost'и:
'app'@'192.168.1.%'— это разные учётные записи.
Поэтому сообщение:
Access denied for user 'app'@'localhost'сразу даёт:
User = app
Host = localhostИменно эту комбинацию нужно искать на сервере.
using password: YES
Например:
Access denied for user 'app'@'localhost'
(using password: YES)означает:
пароль был передан
а не:
пароль верныйПричиной всё ещё может быть неправильный пароль.
↑ К оглавлению2. Проверьте эти же данные без phpMyAdmin
На сервере:
mysql -u app_user -p -h localhostили:
mariadb -u app_user -p -h localhostЕсли здесь тоже Access denied
Например:
ERROR 1045 (28000):
Access denied for user 'app_user'@'localhost'phpMyAdmin, скорее всего, ни при чём.
Проблема:
MySQL/MariaDB
↓
user@host
↓
password
↓
authenticationЕсли CLI входит, а phpMyAdmin — нет
Проверяйте:
- сервер;
- host;
- socket;
config.inc.php;auth_type;- сохранённые credentials;
controluser.
3. Проверьте localhost и 127.0.0.1
localhost и 127.0.0.1 могут использовать разные способы подключения.
Сравнить:
mysql -u app_user -p -h localhostи:
mysql -u app_user -p -h 127.0.0.1 --protocol=TCPПример:
localhost → работает
127.0.0.1 → Access deniedВ config.inc.php:
$cfg['Servers'][$i]['host'] = 'localhost';или:
$cfg['Servers'][$i]['host'] = '127.0.0.1';Socket при необходимости:
$cfg['Servers'][$i]['socket'] = '/path/to/mysql.sock';Не менять host вслепую.
↑ К оглавлению4. Проверьте, существует ли нужный user@host
Если есть admin access:
SELECT User, Host, plugin
FROM mysql.user
ORDER BY User, Host;Если ошибка:
Access denied for user 'site_user'@'localhost'искать:
site_user | localhostДля конкретного account:
SHOW CREATE USER 'site_user'@'localhost';Права:
SHOW GRANTS FOR 'site_user'@'localhost';MariaDB 10.4+
основные данные аккаунтов находятся в mysql.global_priv, а mysql.user используется как совместимое представление.
UPDATE mysql.user ...Для изменения пользователей используйте штатные команды управления.
↑ К оглавлению5. Проверьте authentication plugin
Проверка:
SELECT User, Host, plugin
FROM mysql.user
WHERE User = 'site_user';или:
SHOW CREATE USER 'site_user'@'localhost';MySQL 8.4
- стандартный plugin:
caching_sha2_password; - не переключать автоматически на
mysql_native_password; mysql_native_passwordустарел и в MySQL 8.4 отключён по умолчанию.
Проверять совместимость клиента/phpMyAdmin/PHP driver.
↑ К оглавлению6. Почему root входит через терминал, но phpMyAdmin пишет Access denied
Пример:
sudo mariadbработает.
Но:
rootчерез phpMyAdmin:
Access denied for user 'root'@'localhost'Причина может быть unix_socket authentication.
sudo mariadb не доказывает, что парольный вход root через phpMyAdmin обязан работать.
Не советовать отключать socket auth root только ради браузера.
На production лучше отдельный административный DB account с нужными правами.
↑ К оглавлению7. Проверьте auth_type в phpMyAdmin
Стандартный пример:
$cfg['Servers'][$i]['auth_type'] = 'cookie';Также упомянуть:
config
http
signonauth_type = config
Пример:
$cfg['Servers'][$i]['auth_type'] = 'config';и:
$cfg['Servers'][$i]['user'] = 'some_user';
$cfg['Servers'][$i]['password'] = '...';Если MySQL password изменён, а config остался старым → Access denied.
Не публиковать config.inc.php.
controluser
Отдельно проверьте служебную учётную запись controluser, если она используется.
Пример:
$cfg['Servers'][$i]['controluser'] = 'pma';
$cfg['Servers'][$i]['controlpass'] = '...';Если ошибка относится к:
'pma'@'localhost'проверять configuration storage phpMyAdmin.
↑ К оглавлению8. Если phpMyAdmin используется для базы WordPress
Через WP-CLI:
wp config get DB_NAME
wp config get DB_USER
wp config get DB_HOSTНе выводить DB_PASSWORD.
Пример:
DB_NAME = wordpress
DB_USER = wp_user
DB_HOST = localhostПроверка:
mysql -u wp_user -p -h localhost wordpressWordPress работает, а phpMyAdmin нет
Значит WordPress credentials рабочие, но phpMyAdmin может использовать другой:
- host;
- socket;
- user;
- instance.
WordPress тоже не подключается к базе
Тогда проблема может быть общей.
↑ К оглавлению9. Не путайте ERROR 1045 и отсутствие прав на базу
ERROR 1045
ERROR 1045 (28000):
Access denied for user 'app'@'localhost'
Авторизация не прошла.
Проверять:
user
host
password
authentication pluginERROR 1044
ERROR 1044:
Access denied for user 'app'@'localhost'
to database 'example'Пользователь уже вошёл, но нет нужных privileges.
Проверить:
SHOW GRANTS FOR 'app'@'localhost'; ↑ К оглавлению 10. Как безопасно восстановить пользователя
Сначала определить:
- какое приложение использует account;
- какая база нужна;
- какой Host нужен;
- не используют ли credentials другие сервисы.
Не начинать с GRANT ALL ON *.*
Для WordPress ограничивать права нужной базой.
Логика:
wp_user
↓
только база конкретного WordPressНе:
wp_user
↓
все базы сервераЕсли password меняется, обновить соответствующий DB_PASSWORD в приложении.
Не делать это как эксперимент на production.
↑ К оглавлению11. Проверьте, к тому ли MySQL-серверу подключается phpMyAdmin
Возможные варианты:
- local MariaDB;
- MySQL in Docker;
- remote database;
- hosting database;
- multiple instances / ports.
Проверить:
host, port, socket.
SQL:
SELECT @@hostname, @@port, @@version;
И:
SHOW VARIABLES LIKE 'socket';Затем выполните:
SELECT USER(), CURRENT_USER();Объяснить различие:
USER()— client connection;CURRENT_USER()— account, который MySQL реально использует для privilege checks.
13. Логи MySQL/MariaDB
MySQL:
journalctl -u mysql --since "10 minutes ago"MariaDB:
journalctl -u mariadb --since "10 minutes ago"Название service может отличаться.
Повторить попытку входа и искать событие того же времени.
Не включать logging чувствительных данных.
↑ К оглавлению14. Быстрая диагностика
Шаг 1
Записать:
user
host
using password YES/NOШаг 2
CLI:
mysql -u USER -p -h HOSTШаг 3
Сравнить:
mysql -u USER -p -h localhostи:
mysql -u USER -p -h 127.0.0.1 --protocol=TCPШаг 4
SELECT User, Host, plugin
FROM mysql.user
WHERE User = 'USER';Шаг 5
SHOW CREATE USER 'USER'@'HOST';Шаг 6
SHOW GRANTS FOR 'USER'@'HOST';Шаг 7
Проверить:
auth_type
host
port
socket
controluserШаг 8
Для WordPress:
DB_USER
DB_HOST
DB_NAMEШаг 9
Authentication:
unix_socket
caching_sha2_passwordШаг 10
Повторить login одновременно с DB logs.
↑ К оглавлениюПочему пароль правильный, но phpMyAdmin всё равно пишет Access denied?
важны не только password, но и:
user
host
способ подключения
authentication pluginПоэтому localhost и 127.0.0.1 могут вести себя по-разному.
Частые вопросы
Что означает Access denied for user 'root'@'localhost'?
Сервер MySQL/MariaDB отклонил попытку авторизации `root@localhost`. Причиной может быть неверный пароль, другой authentication plugin или способ подключения. В MariaDB на Linux `root` нередко использует socket-аутентификацию, поэтому успешный `sudo mariadb` не означает, что парольный вход root через phpMyAdmin обязан работать.
Почему phpMyAdmin не принимает пароль, хотя MySQL через терминал работает?
Сравните способ подключения. CLI может использовать Unix socket, а phpMyAdmin — другой host/socket или другой экземпляр базы. Также проверьте `auth_type`, `host` и `socket` в конфигурации phpMyAdmin.
Что означает using password: YES?
Это означает, что при попытке соединения был передан пароль. Это не подтверждение его правильности.
Нужно ли переключать MySQL на mysql_native_password?
Нет, не как универсальное решение. В актуальном MySQL 8.4 стандартным является `caching_sha2_password`, а `mysql_native_password` устарел и отключён по умолчанию. Сначала выясните реальную причину несовместимости или отказа.
Можно ли изменить пароль root через phpMyAdmin?
Техническая возможность зависит от прав и способа аутентификации, но менять authentication административного `root` только ради входа в phpMyAdmin обычно плохая идея. Сначала определите текущую модель безопасности сервера.
Главное
Ошибка:
Access denied for user 'name'@'host'— это не просто сообщение неверный пароль.
Правильная цепочка:
кто подключается?
↓
откуда подключается?
↓
CLI повторяет ошибку?
↓
localhost или TCP?
↓
существует ли user@host?
↓
какой authentication plugin?
↓
какие права?
↓
куда подключается phpMyAdmin?
↓
что показывает лог?Не начинать с удаления пользователей, изменения root и глобального GRANT.
Цель — понять, почему MySQL или MariaDB отклоняет именно эту учётную запись при этом способе подключения.
Нужна помощь с WordPress?
Если после последовательной проверки причина остаётся неясной, можно обратиться за диагностикой WordPress. Также доступны все инструкции WebFixer24.