Como posso restaurar todos os privilégios do usuário root do MySQL?

108

Eu acidentalmente removi alguns dos privilégios do meu usuário root do MySQL, incluindo a capacidade de alterar tabelas. Existe alguma maneira de restaurar este usuário ao seu estado original (com todos os privilégios)?

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'
Steven
fonte
1
O segundo erro parece um problema de senha. Provavelmente minha culpa por presumir que você já tinha uma conta 'root' @ 'localhost'. Execute novamente o mysqld com --skip-grant-tables e: "DROP USER 'root' @ 'localhost'; GRANT ALL PRIVILEGES ON . TO 'root' @ '%';" em vez de? A melhor maneira de descobrir a qual conta você deve conceder acesso é executar "SELECT User, Host FROM mysql.user WHERE User = 'root';" ... que lhe dará o nome do host que deve ser usado após o @ símbolo no comando GRANT.
DMI
1
É uma má forma para os mods marcarem o tópico como fora do tópico, exceto que pode haver outro site Stack Exchange mais adequado para o tópico, caso em que deve ser identificado. (Que vergonha para os mods.) Aqui é onde isso pode ir: dba.stackexchange.com
Jon Davis
^ concordou, votei para reabrir. se foi encerrado devido à existência do site DBA, isso deveria pelo menos ter sido mencionado e o OP dirigido para lá. (Ou potencialmente encerrada como uma duplicata de outra pergunta aqui)
indivisível

Respostas:

148

Se GRANT ALLnão funcionar, tente:

  1. Pare mysqlde reinicie-o com a --skip-grant-tablesopção.
  2. Conecte-se ao mysqldservidor apenas com: mysql(ou seja, sem -popção e o nome de usuário pode não ser necessário).
  3. Emita os seguintes comandos no cliente mysql:

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

    FLUSH PRIVILEGES;

Depois disso, você deve ser capaz de executar GRANT ALL ON *.* TO 'root'@'localhost';e fazer funcionar.

DMI
fonte
7
1.Como conectar ao servidor mysqld com apenas: mysql 2.Quando eu executei UPDATE mysql.user SET Grant_priv = '1' WHERE User = 'root'; FLUSH PRIVILEGES; Recebi a consulta ok, 0 linhas afetadas (0,00 seg) linhas correspondidas: 2 alteradas: 0 avisos: 0 Consulta ok, 0 linhas afetadas (0,00 seg). Quando eu loguei no phpMyAdmin como usuário root, ainda vejo "Sem privilégios".
Steven de
Após as etapas acima, você deve ser capaz de executar o comando GRANT ALL. Para se conectar ao mysqld, eu quis dizer que você não precisará de uma senha - não me lembro se algum nome de usuário funcionará ou se precisará ser "root".
DMI de
2
Isso não funciona. Como Steven disse, a atualização da tabela do usuário afeta 0 registros. O usuário root continua incapaz de conceder.
Cerin
1
Sim, funciona. E se você estiver no Windows, apenas adicione temporariamente skip-grant-tablesà [mysqld]seção do seu arquivo de configuração do mysql para acessar o mysql na linha de comando sem senha.
markus de
1
Eu fiquei na parte de Grant (que não funcionou) por mais de 9 horas e sua resposta me salvou ... você é um salva-vidas. Muito obrigado
Ali SH
91

Se você excluiu seu rootusuário por engano, pode fazer uma coisa:

  1. Pare o serviço MySQL
  2. Corre mysqld_safe --skip-grant-tables &
  3. Digite mysql -u root -pe pressione Enter.
  4. Coloque sua senha
  5. Na linha de comando do mysql, digite: use mysql;

Em seguida, execute esta consulta:

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');

então reinicie o mysqld

EDITAR: 6 de outubro de 2018

Caso alguém precise dessa resposta, tentei hoje usando innodb_version 5.6.36-82.0 e 10.1.24-MariaDB e funciona se você REMOVER OS ANTERIORES (sem aspas simples, apenas remova-as):

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');
Bipin Bahuguna
fonte
1
@Bipin, Estranho só tem mysqld.exena binpasta, não mysqld_safe.exe. O que você quer dizer com "mysqld_safe"?
Pacerier
4
Para MySQL 5.5, você precisa de mais dois privs, Event_priv e Trigger_priv.
Greg Bell
Eu imagino que isso quebra em 5.6.5
Otheus
1
@Pacerier - de acordo com este post você realmente não precisa mysqld_safe, apenas execute o binário normal do mysqld:mysqld.exe --skip-grant-tables
bkwdesign
2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber
24

Eu também removo privilégios de root e banco de dados que não aparecem no console mysql quando eu era um usuário root, então mudei o usuário por mysql>mysql -u 'userName' -p;e a senha;

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

FLUSH PRIVILEGES;

após este comando, tudo mostra o banco de dados na raiz.

obrigado

Prabhu
fonte
1
Eu tive que fazer uma combinação de coisas. Eu tive que parar o serviço mysqld, então executar mysqld_safe --skip-crant-tables &, então o comando UPDATE acima, então reiniciar mysql, então executar GRANT ALL ON . PARA 'usuário' @ 'localhost';
Nick Woodhams
5

Eu tinha negado os privilégios de inserir e recarregar para fazer root. Portanto, após atualizar as permissões, FLUSH PRIVILEGES não estava funcionando (devido à falta de privilégio de recarregamento). Então, usei o usuário debian-sys-maint no Ubuntu 16.04 para restaurar os privilégios user.root. Você pode encontrar a senha de user.debian-sys-maint neste arquivo

sudo cat /etc/mysql/debian.cnf
Varun Kumar
fonte
Você me salvou! GRANT não estava funcionando nem no modo --skip-grant-tables, então entrar como ubuntu-system me permite criar meu usuário root novamente, e então eu poderia atualizar todos os privilégios
lunix15
4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

Basta fazer login a partir do root usando a respectiva senha, se houver, e simplesmente executar o comando acima para qualquer usuário.

Por exemplo:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;
desconhecidos
fonte
3
mas se o usuário 'root' perdeu privilégios, então como isso pode funcionar, o usuário root não precisa de privilégios elevados para fazer isso? Isto não funcionou para mim.
Terungwa
3

Basta inserir ou atualizar mysql.usercom o valor dos Yprivilégios de cada coluna.

user1316095
fonte
2

Se você estiver usando WAMP em seu computador local (mysql versão 5.7.14) Etapa 1: abra o arquivo my.ini Etapa 2: descomente esta linha 'skip-grant-tables' removendo o ponto e vírgula etapa 3: reinicie o mysql etapa 4 do servidor: inicie a etapa 5 do console mySQL:

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

Etapa 6: Problema resolvido !!!!

Terungwa
fonte