Удалить привилегии из базы данных MySQL
Прежде чем вы подумаете, что это дублирующий вопрос, я полагаю, что у меня есть уникальный, даже если он несколько туповат, случай.
Несколько дней назад я обновил версию MySQL на своем сервере Ubuntu 10.04 до версии 5.3.3 (она опережает версии Ubuntu для 10.04). Сегодня я попытался войти в phpMyAdmin для чего-то и обнаружил несколько страшную ошибку Connection for controluser as defined in your configuration failed
.
После следующих описаний из нескольких вопросов SO о том, как это исправить, я стал застрял.
- Я попытался перенастроить phpMyAdmin, но безуспешно.
- Я попытался удалить phpMyAdmin и переустановить его , но он не смог удалить привилегии из базы данных и потерпел неудачу.
- Затем я попытался вручную удалить привилегии пользователя - несколько глупо, я мог бы добавить - из базы данных, затем сбросив базу данных, затем пользователя (с
flush privileges
). - Я полностью удалил всю установку phpMyAdmin (удалив приложение и каталог /etc/phpmyadmin) и переустановлен (с помощью apt-get), но в нем говорилось, что разрешения для пользователя phpmyadmin уже существуют:
granting access to database phpmyadmin for phpmyadmin@localhost: already exists
Итак, вот с чем я остался. У меня есть грант, который я не могу ни изменить, ни отозвать:
mysql> show grants for 'phpmyadmin'@'localhost';
+-------------------------------------------------------------------------------------------------------------------+
| Grants for phpmyadmin@localhost |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'phpmyadmin'@'localhost' IDENTIFIED BY PASSWORD '*46CFC7938B60837F46B610A2D10C248874555C14' |
| GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO 'phpmyadmin'@'localhost' |
+-------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.26 sec)
mysql> revoke usage on *.* from 'phpmyadmin'@'localhost';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on host 'localhost'
mysql> revoke usage on *.* from 'phpmyadmin'@'localhost' identified by 'trustno1';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on host 'localhost'
(Не волнуйтесь, я больше не использую этот пароль, но это был пароль, который использовался ранее, и это не тот пароль, который я выбрал для новой установки phpmyadmin).
Как мне полностью удалить эти гранты/привилегии? Я рад снова начать с нуля, если потребуется (то есть phpmyadmin, а не бд).
2 answers
Привилегия ИСПОЛЬЗОВАНИЯ в mysql просто означает, что для пользователя 'phpadmin'@'localhost' нет привилегий, определенных на глобальном уровне *.*
. Кроме того, тот же пользователь имеет ВСЕ права доступа к базе данных phpmyadmin phpadmin.*
.
Поэтому, если вы хотите удалить все привилегии и начать полностью с нуля, сделайте следующее:
-
Отменить все привилегии на уровне базы данных:
REVOKE ALL PRIVILEGES ON phpmyadmin.* FROM 'phpmyadmin'@'localhost';
-
Удалить пользователя 'phpmyadmin'@'локальный хост'
DROP USER 'phpmyadmin'@'localhost';
Описанная выше процедура полностью удалит пользователя из вашего экземпляра, это означает, что вы можете воссоздать его с нуля.
Чтобы дать вам немного информации о том, что описано выше: как только вы создадите пользователя, таблица mysql.user
будет заполнена. Если вы посмотрите на запись в нем, вы увидите, что пользователю и всем привилегиям присвоено значение 'N'
. Если вы сделаете show grants for 'phpmyadmin'@'localhost';
, вы увидите, что все уже готово, вывод выше. Просто переводится как "нет привилегии на глобальном уровне для пользователя". Теперь ваш грант ALL
этому пользователю на уровне базы данных будет сохранен в таблице mysql.db
. Если вы сделаете SELECT * FROM mysql.db WHERE db = 'nameofdb';
, вы увидите 'Y'
на каждом привате.
Вышеописанный сценарий показывает сценарий, который у вас есть в вашей бд в настоящее время. Таким образом, наличие пользователя, у которого есть только привилегии USAGE
, означает, что этот пользователь может подключаться, но, кроме SHOW GLOBAL VARIABLES; SHOW GLOBAL STATUS;
, у него нет других привилегий.
В качестве примечания, причина, по которой revoke usage on *.* from 'phpmyadmin'@'localhost';
не работает, довольно проста: грант не называется USAGE
.
Фактические именованные гранты указаны в документации MySQL
Грант USAGE
является логическим грантом. Как? "phpmyadmin"@"локальный хост" содержит запись в mysql.user
, где пользователь="phpmyadmin" и хост="локальный хост". Любая строка в mysql.user семантически означает USAGE
. Запуск DROP USER 'phpmyadmin'@'localhost';
должен работать просто отлично. Под капотом он действительно делает вот что:
DELETE FROM mysql.user WHERE user='phpmyadmin' and host='localhost';
DELETE FROM mysql.db WHERE user='phpmyadmin' and host='localhost';
FLUSH PRIVILEGES;
Следовательно, удаление строки из mysql.user
означает выполнение REVOKE USAGE
, даже если REVOKE USAGE
не может быть выполнено буквально.