Как я могу восстановить полные права пользователя MySQL?
Я случайно удалил некоторые привилегии из моего пользователя root MySQL, в том числе возможность изменять таблицы. Есть ли какой-нибудь способ вернуть этого пользователя в исходное состояние (со всеми привилегиями)?
UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).
#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'
10 ответов
Если GRANT ALL
не работает, попробуйте:
- Стоп
mysqld
и перезапустите его с--skip-grant-tables
вариант. - Подключиться к
mysqld
сервер с просто:mysql
(т.е. нет-p
вариант, и имя пользователя может не потребоваться). Выполните следующие команды в клиенте mysql:
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
После этого вы сможете запустить GRANT ALL ON *.* TO 'root'@'localhost';
и это работает.
Если вы удалили свой root
Пользователь по ошибке может сделать одну вещь:
- Остановить службу MySQL
- Бежать
mysqld_safe --skip-grant-tables &
- Тип
mysql -u root -p
и нажмите ввод. - Введите ваш пароль
- В командной строке mysql введите:
use mysql;
Затем выполните этот запрос:
insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`)
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');
затем перезапустите mysqld
РЕДАКТИРОВАТЬ: 6 октября 2018
В случае, если кому-то еще нужен этот ответ, я попробовал его сегодня, используя innodb_version 5.6.36-82.0 и 10.1.24-MariaDB, и он работает, если вы УДАЛИТЕ КНОПКИ (без одинарных кавычек, просто уберите их)
insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections)
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');
Я также удаляю привилегии root и базу данных, не отображаемую в консоли mysql, когда я был пользователем root, поэтому изменил пользователя mysql>mysql -u 'userName' -p;
и пароль;
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
после этой команды все это показывает базу данных в корне.
Спасибо
Я отказал в праве на вставку и перезагрузку root. Таким образом, после обновления разрешений FLUSH PRIVILEGES не работал (из-за отсутствия привилегии перезагрузки). Поэтому я использовал пользователя debian-sys-maint в Ubuntu 16.04 для восстановления привилегий user.root. Вы можете найти пароль user.debian-sys-maint из этого файла
sudo cat /etc/mysql/debian.cnf
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;
Просто войдите в систему с правами root, используя соответствующий пароль, если он есть, и просто выполните приведенную выше команду для любого пользователя.
Например:
GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;
Если вы используете WAMP на локальном компьютере (mysql версия 5.7.14) Шаг 1: откройте файл my.ini Шаг 2: откомментируйте эту строку 'skip-grant-tables', удалив точку с запятой шаг 3: перезапустите mysql шаг сервера 4: запустите консоль mySQL, шаг 5:
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
Шаг 6: Проблема решена!!!!
Просто вставьте или обновите mysql.user
со значением Y
в каждом столбце привилегии.
То же самое выше.
Полный ответ: http://www.myee.web.id/?p=869
- "sudo cat /etc/mysql/debian.cnf" для использования пользователя debian-sys-maint
- войдите под этим пользователем через "mysql -u
saved-username
-p; ", затем введите сохраненный пароль. - mysql> ОБНОВЛЕНИЕ mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
- mysql> ПРИВИЛЕГИИ ПРОМЫВКИ;
- mysql> выход
- перезагрузка Спасибо
MariaDB на RHEL:
sudo systemctl stop mariadb.service
sudo mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root
Тогда, например.
GRANT ALL PRIVILEGES ON mysql.user TO 'root'@'localhost';
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
К сожалению, при отключении с помощью
&
:
sudo kill `pidof mysqld`
sudo systemctl start mariadb.service
Но можно было также установить
skip-grant-tables
а также
skip-networking
внутри
/etc/my.cnf
.
Если вы удалили пользователя root (скажем, попытались установить нового пользователя с привилегиями root) в Ubuntu/Debian, вам следует:
- остановить службу
systemctl stop mysql
. - Обычно редактируйте mysqld.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf
в зависимости от дистрибутива. - Добавьте сразу после
[mysqld]
сессия. - Перезапустите службу
systemctl restart mysql
. - Войдите в MySQL без пользователя, только с
mysql
. - И, как уже упоминалось выше, установите желаемого пользователя с правами root:
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
.
После этого не забудьте отредактироватьmysqld.cnf
, прокомментируйтеskip-grant-tables
и снова перезапустите сервер.
Примечание: для меня добавьте--skip-grant-tables
в течениеmysqld
сервер не работал. При попытке подключения сервер разбился.