Как я могу восстановить полные права root-пользователя MySQL?

Я случайно удалил некоторые привилегии моего корневого пользователя 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'

person Community    schedule 10.11.2009    source источник
comment
Вторая ошибка выглядит как проблема с паролем. Вероятно, я виноват в том, что предположил, что у вас уже есть учетная запись 'root' @ 'localhost'. Повторно запустите mysqld с --skip-grant-tables и: DROP USER 'root' @ 'localhost'; ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ НА . 'root' @ '%'; вместо? Лучший способ узнать, к какой учетной записи вы должны предоставить доступ, - это запустить SELECT User, Host FROM mysql.user WHERE User = 'root'; ..., который даст вам имя хоста, которое следует использовать после символа @ в команда GRANT.   -  person DMI    schedule 11.11.2009
comment
Для модов плохой тоном отмечать тему как не относящуюся к теме, если она не не соответствует теме, за исключением того, что может быть другой сайт Stack Exchange, более подходящий для этой темы, и в этом случае его следует идентифицировать. (Позор модов.) Вот где это может быть: dba.stackexchange.com   -  person Jon Davis    schedule 28.08.2014
comment
^ согласился, я проголосовал за повторное открытие. если он был закрыт из-за существования сайта администратора баз данных, это должно было быть хотя бы упомянуто и OP был направлен туда. (Или потенциально закрыто как дубликат другого вопроса здесь)   -  person indivisible    schedule 28.09.2016


Ответы (8)


Если GRANT ALL не работает, попробуйте:

  1. Остановите mysqld и перезапустите его с опцией --skip-grant-tables.
  2. Подключитесь к серверу mysqld, используя только: mysql (т.е. без параметра -p, и имя пользователя может не требоваться).
  3. Выполните следующие команды в клиенте mysql:

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

После этого вы сможете запустить GRANT ALL ON *.* TO 'root'@'localhost'; и заставить его работать.

person DMI    schedule 10.11.2009
comment
1. Как подключиться к серверу mysqld с помощью всего: mysql 2. Когда я выполнил UPDATE mysql.user SET Grant_priv = '1' WHERE User = 'root'; ПРИВИЛЕГИИ ПРОМЫВКИ; Я получил запрос в порядке, 0 затронутых строк (0,00 с) совпали строки: 2 изменено: 0 предупреждений: 0 запрос в порядке, 0 затронутых строк (0,00 с). Когда я вошел в phpMyAdmin как пользователь root, я все еще не вижу никаких привилегий. - person Steven; 10.11.2009
comment
К сожалению, после описанных выше шагов вы сможете запустить команду GRANT ALL. Я имел в виду, что для подключения к mysqld вам не понадобится пароль - я не могу вспомнить, будет ли какое-либо имя пользователя работать или оно должно быть root. - person DMI; 10.11.2009
comment
Также обратите внимание, что я обновил решение, чтобы также предоставить привилегию SUPER и предоставить альтернативный синтаксис. Не забудьте перед тестированием удалить опцию skip-grant-tables! - person DMI; 10.11.2009
comment
Это не работает. Как сказал Стивен, обновление таблицы пользователей влияет на 0 записей. Пользователь root по-прежнему не может предоставить. - person Cerin; 17.05.2012
comment
Это сработало для меня (очень благодарно), однако последний шаг GRANT ALL ON *. * мне @ localhost; дает мне 0 затронутых строк. Не уверен, что это означает, что у меня уже есть привилегии. - person PJ Brunet; 04.07.2013
comment
Да, работает. А если вы работаете в Windows, просто временно добавьте skip-grant-tables в раздел [mysqld] вашего файла конфигурации mysql, чтобы получить доступ к mysql из командной строки без пароля. - person markus; 17.11.2013
comment
я застрял на части Гранта (которая не сработала) более чем на 9 часов, и ваш ответ спас меня ... вы спасатель. большое спасибо - person Ali SH; 27.11.2017
comment
Для последних версий mySQL вы можете получить ошибку при попытке запустить mysqld с флагом --skip-grant-tables. В этом сообщении показано, как это обойти: stackoverflow.com/questions/4963171/ По сути, вам нужно убить процесс с помощью соответствующего pid, cd в папку mysql (путь может незначительно отличаться, мой был / usr / local / mysql) и передать права собственности на файлы пользователю, не являющемуся пользователем root. Эта команда работает: sudo chown -R mysql / usr / local / mysql /. После этого вы сможете безопасно запустить сервер. - person ALisboa; 13.04.2018

Если вы по ошибке удалили своего root пользователя, вы можете сделать одно:

  1. Остановить службу MySQL
  2. Запустите mysqld_safe --skip-grant-tables &
  3. Введите mysql -u root -p и нажмите ввод.
  4. Введите свой пароль
  5. В командной строке 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');
person Community    schedule 03.08.2011
comment
@Bipin, Странно там только mysqld.exe в папке bin, а не mysqld_safe.exe. Что вы имеете в виду под mysqld_safe? - person Pacerier; 07.05.2015
comment
Для MySQL 5.5 вам понадобятся еще две привилегии, Event_priv и Trigger_priv. - person Greg Bell; 03.02.2016
comment
Я полагаю, что это разрывается в 5.6.5 - person Otheus; 16.02.2016
comment
@Pacerier - согласно этому сообщению, вы на самом деле не нужен mysqld_safe, просто запустите обычный двоичный файл mysqld: mysqld.exe --skip-grant-tables - person bkwdesign; 23.03.2016
comment
У этого нет ВСЕХ ПРИВИЛЕГИЙ. Этот сработал лучше: stackoverflow.com/questions/6085455/ - person ParoX; 30.01.2017
comment
Если кому-то еще нужен этот ответ, я попробовал его сегодня, используя innodb_version 5.6.36-82.0 и 10.1.24-MariaDB, и он работает, если вы УДАЛИТЕ ОТВЕТЫ (ни одного цитаты тоже, просто удалите их) - person Scaramouche; 07.10.2018
comment
В MySQL такая же ошибка, как у @JamieHutber. Столбец "Неизвестный пароль". - person Apache; 21.10.2018
comment
Это все еще работало для меня сегодня с MariaDB 10.3.16, большое спасибо, сэкономил мне драгоценное время. - person Marçal Torroella; 01.07.2019
comment
Обратите внимание, что в MySQL 8.0+ (возможно, и в более ранних версиях) нет столбца Password. Он был заменен на authentication_string, поэтому просто замените его в запросе выше. - person devius; 21.11.2019

Я также удаляю привилегии root и базы данных, которые не отображаются в консоли mysql, когда я был пользователем root, поэтому изменил пользователя на mysql>mysql -u 'userName' -p; и пароль;

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

после этой команды все показывает базу данных в корне.

Спасибо

person Community    schedule 19.01.2012
comment
Мне пришлось сделать несколько вещей. Мне пришлось остановить службу mysqld, затем запустить mysqld_safe --skip-crant-tables &, затем вышеуказанную команду UPDATE, затем перезапустить mysql, затем выполнить GRANT ALL ON . TO 'user' @ 'localhost '; - person Nick Woodhams; 19.12.2012

Я отказал root в правах на вставку и перезагрузку. Таким образом, после обновления разрешений FLUSH PRIVILEGES не работал (из-за отсутствия прав на перезагрузку). Поэтому я использовал debian-sys-maint user в Ubuntu 16.04 для восстановления прав user.root. Вы можете найти пароль для user.debian-sys-maint в этом файле

sudo cat /etc/mysql/debian.cnf
person Community    schedule 24.09.2017
comment
Ты спас меня! GRANT не работал ни в режиме --skip-grant-tables, поэтому вход в качестве ubuntu-system позволяет мне снова создать моего пользователя root, и тогда я могу обновить все привилегии - person lunix15; 03.07.2020
comment
Вы меня тоже спасли (linux Mint 20.1, mysql 8.0.23-0ubuntu0.20.04.1). То же самое, --skip-grant-tables не работает в Mint, mysql и атрибуты пользователя были изменены (атрибут пароля теперь authentication_string, функция PASSWORD больше не работает ..). Лучше использовать phpmyadmin или mysql refs для проверки правильного синтаксиса, так как почти все, что я указываю, устарело или не подходит для моего env. - person jerome; 04.04.2021

GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

Просто войдите в систему от root, используя соответствующий пароль, если таковой имеется, и просто запустите указанную выше команду для любого пользователя.

Например:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;
person Community    schedule 24.11.2012
comment
но если пользователь root потерял привилегии, то как это может работать, разве пользователю root не нужны повышенные привилегии для этого? это не сработало для меня. - person Terungwa; 27.12.2017

Просто вставьте или обновите mysql.user со значением Y в каждом столбце привилегий.

person Community    schedule 05.04.2012

Если вы используете 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: Проблема решена !!!!

person Community    schedule 27.12.2017

  1. sudo cat /etc/mysql/debian.cnf для использования пользователя debian-sys-maint
  2. войдите в систему под этим пользователем через mysql -u saved-username -p;, затем введите сохраненный пароль.
  3. mysql ›ОБНОВЛЕНИЕ mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
  4. mysql ›ПРИВИЛЕГИИ ДЛЯ ПРОМЫВКИ;
  5. mysql ›выход
  6. перезагрузка Спасибо
person Community    schedule 20.10.2020