"Ошибка MySQL 1045 (Access denied) после изменения хоста с % на localhost – пропали БД и права суперпользователя"
"Ошибка MySQL 1045 (Access denied) после изменения хоста с % на localhost – пропали БД и права суперпользователя"
Текст вопроса:
Приветствую! Я начинающий разработчик и столкнулся с критической проблемой в MySQL. Опишу ситуацию по шагам:
- Исходная ошибка
При подключении к БД проекта (medical_cms) получал ошибку:
SQLSTATE[HY000] [1045] Access denied for user 'user'@'localhost' (using password: YES)
- Проверил
config.php— данные верные (хост, логин, пароль). - Пользователь
'user'@'localhost'существовал в MySQL.
Мои действия (что сделал не так)
Зашел в phpMyAdmin → вкладка Привилегии.
У пользователя
'user'хост был%(доступ с любого IP).Изменил хост с
%наlocalhost(думая, что это исправит ошибку 1045).Результат
- После этого пропал доступ к БД
medical_cms. - В phpMyAdmin теперь нет ни пользователя
'user'@'localhost', ни самой БД. - Суперпользователь
rootтоже не может подключиться (ошибка 1045).
Что пробовал
Перезагружал MySQL:
sudo systemctl restart mysqlПроверил наличие процессов MySQL:
ps aux | grep mysqlПытался зайти в MySQL через
root:mysql -u root -p→ Та же ошибка Access denied.
Дополнительная информация
- ОС: winda
- MySQL: 8.0
- PHP: 8.1
Проект: medical_cms Как восстановить:
- Доступ к MySQL (хотя бы для
root)? - Удаленную БД
medical_cms(если нет бэкапа)? - Правильные настройки пользователя
'user', чтобы избежать ошибки 1045?
Заранее благодарен за помощь!
Ответы (2 шт):
Если погуглить, первым дело вылазит алгоритм восстановления:
- Остановить службу базы данных с помощью команды service mysqld stop
- Запустить службу без таблиц привилегий с помощью команды mysqld --skip-grant-tables&
- Подключиться к серверу как root, пароль вводить не потребуется
- Подключить таблицы привилегий с помощью команды FLUSH PRIVILEGES
- Установить новый пароль суперпользователя root с помощью команды ALTER USER 'root'@'localhost' IDENTIFIED BY 'ПАРОЛЬ'
- Выйти из mysql с помощью команды quit
- Запустить сервер баз данных в штатном режиме с помощью команды service mysqld start
Точно так же можно и с другими юзерами поработать. Но лучше уже от рута.
- Остановите веб-сервер и PHP-сервер. До восстановления MySQL они вам не понадобятся, а мешать будут.
- Выполните процедуру восстановления, описанную в How to Reset the Root Password, раздел "Resetting the Root Password: Generic Instructions" со следующими изменениями:
- перед выполнением установки нового пароля инструкцией ALTER USER получите список имеющихся пользователей.
select user, host from mysql.user;
- убедитесь, что имеется переименованный вами пользователь 'user'@'localhost' и не имеется пользователя 'user'@'%'.
- получите список прав этого пользователя.
show grants for root@localhost;
- список прав должен выглядеть так:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT OPTION
GRANT ALLOW_NONEXISTENT_DEFINER,APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,FLUSH_OPTIMIZER_COSTS,FLUSH_PRIVILEGES,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,OPTIMIZE_LOCAL_TABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_ANY_DEFINER,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,TELEMETRY_LOG_ADMIN,TRANSACTION_GTID_TAG,XA_RECOVER_ADMIN ON *.* TO `root`@`localhost` WITH GRANT OPTION
GRANT PROXY ON ``@`` TO `root`@`localhost` WITH GRANT OPTION
- если указанные проверки не показали отличий - установите пользователю новый пароль.
- Закройте CLI, перезапустите службу MySQL. Убедитесь, что CLI подключается пользователем root с использованием установленного пароля, а после подключения список привилегий этого пользователя точно соответствует указанному выше.
- Создайте новую учётную запись резервного администратора. Назначьте ему тот же полный список привилегий. Сбросьте привилегии на диск.
- Проверьте, что ваша БД присутствует и доступна пользователю root.
- Создайте отдельного пользователя для работы вашей системы. Назначьте ему пароль, дайте ему необходимые привилегии для работы с вашей БД. Сбросьте привилегии на диск.
- Запустите ещё один CLI с использованием учётной записи дополнительного админа, проверьте, что аутентификация выполняется, а список привилегий соответствует.
- Запустите ещё один CLI с использованием созданного пользователя для работы с БД, убедитесь, что он имеет необходимый доступ к БД.
- На всякий случай - создайте полный бэкап вашей БД.
- Внесите изменения в конфиг-файлы вашей системы и перепишите всё на использование созданной учётной записи.
- Теперь запускайте веб- и PHP-серверы и проверяйте работу системы.
PS. Имея локальный доступ, старайтесь не использовать PMA. Используйте CLI, его более чем достаточно для любых административных работ. В крайнем случае - предварительно убедитесь, что версия PMA соответствует используемой версии MySQL.