Come posso ripristinare i privilegi completi dell'utente root di MySQL?


108

Ho rimosso accidentalmente alcuni privilegi dal mio utente root MySQL, inclusa la possibilità di modificare le tabelle. C'è un modo per riportare questo utente al suo stato originale (con tutti i privilegi)?

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'

1
Il secondo errore sembra un problema di password. Probabilmente è colpa mia se presumo che tu abbia già un account "root" @ "localhost". Riesegui mysqld con --skip-grant-tables e: "DROP USER 'root' @ 'localhost'; GARANTISCI TUTTI I PRIVILEGI SU . A 'root' @ '%';" anziché? Il modo migliore per scoprire a quale account dovresti concedere l'accesso è eseguire "SELECT User, Host FROM mysql.user WHERE User = 'root';" ... che ti darà il nome host che dovrebbe essere usato dopo @ simbolo nel comando GRANT.
DMI

1
È una cattiva idea per le mod contrassegnare l'argomento come fuori tema quando non è fuori argomento, tranne per il fatto che potrebbe esserci un altro sito Stack Exchange più adatto per l'argomento, nel qual caso dovrebbe essere identificato. (Peccato per le mod.) Ecco dove potrebbe andare: dba.stackexchange.com
Jon Davis

^ d'accordo, ho votato per riaprire. se fosse stato chiuso a causa dell'esistenza del sito DBA, quello avrebbe dovuto almeno essere menzionato e l'OP indirizzato lì. (O potenzialmente chiuso come duplicato di un'altra domanda qui)
indivisibile

Risposte:


148

Se GRANT ALLnon funziona, prova:

  1. Fermalo mysqlde riavvialo con l' --skip-grant-tablesopzione.
  2. Connettiti a mysqld server con solo: mysql(cioè nessuna -popzione e il nome utente potrebbe non essere richiesto).
  3. Esegui i seguenti comandi nel client mysql:

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

    FLUSH PRIVILEGES;

Dopodiché, dovresti essere in grado di correre GRANT ALL ON *.* TO 'root'@'localhost';e farlo funzionare.


7
1. Come connettersi al server mysqld con solo: mysql 2.Quando ho emesso UPDATE mysql.user SET Grant_priv = '1' WHERE User = 'root'; PRIVILEGI DI FLUSH; Ho Query ok, 0 righe interessate (0.00 sec) righe abbinate: 2 modificate: 0 avvisi: 0 Query ok, 0 righe interessate (0.00 sec). Quando ho effettuato l'accesso a phpMyAdmin come utente root, vedo ancora "Nessun privilegio".
Steven

Spiacenti, dopo i passaggi precedenti dovresti essere in grado di eseguire il comando GRANT ALL. Per connetterti a mysqld, volevo dire che non avrai bisogno di una password - non ricordo se un nome utente funzionerà o se dovrà essere "root".
DMI

2
Questo non funziona. Come ha detto Steven, l'aggiornamento alla tabella utente ha effetto 0 record. L'utente root non è in grado di concedere.
Cerin

1
Sì, funziona. E se sei su Windows, aggiungi temporaneamente skip-grant-tablesalla [mysqld]sezione del tuo file di configurazione mysql per accedere a mysql sulla riga di comando senza password.
markus

1
sono rimasto bloccato alla parte Grant (che non ha funzionato) per più di 9 ore e la tua risposta mi ha salvato ... sei un salvavita.grazie mille
Ali SH

91

Se hai cancellato il tuo rootutente per errore puoi fare una cosa:

  1. Arresta il servizio MySQL
  2. Correre mysqld_safe --skip-grant-tables &
  3. Digita mysql -u root -pe premi invio.
  4. Inserisci la tua password
  5. Nella riga di comando mysql inserisci: use mysql;

Quindi esegui questa query:

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

quindi riavvia il mysqld

EDIT: 6 ottobre 2018

Nel caso qualcun altro abbia bisogno di questa risposta, l'ho provata oggi usando innodb_version 5.6.36-82.0 e 10.1.24-MariaDB e funziona se RIMUOVI I BACKTICK (neanche virgolette singole, rimuovile semplicemente):

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

1
@ Bipin, strano c'è solo mysqld.exenella bincartella, non mysqld_safe.exe. Cosa intendi con "mysqld_safe"?
Pacerier

4
Per MySQL 5.5, sono necessari altri due priv, Event_priv e Trigger_priv.
Greg Bell

Immagino che questo si interrompa in 5.6.5
Otheus

1
@Pacerier - secondo questo post non ti serve davvero mysqld_safe, esegui il normale binario mysqld:mysqld.exe --skip-grant-tables
bkwdesign

2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber

24

rimuovo anche i privilegi di root e database non visualizzati nella console mysql quando ero un utente root, quindi ho cambiato utente con mysql>mysql -u 'userName' -p;e password;

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

FLUSH PRIVILEGES;

dopo questo comando mostra tutto il database in root.

Grazie


1
Ho dovuto fare una combinazione di cose. Ho dovuto interrompere il servizio mysqld, quindi eseguire mysqld_safe --skip-crant-tables &, quindi il comando UPDATE sopra, quindi riavviare mysql, quindi eseguire GRANT ALL ON . A "utente" @ "localhost";
Nick Woodhams

5

Avevo negato i privilegi di inserimento e ricarica a root. Quindi, dopo aver aggiornato le autorizzazioni, FLUSH PRIVILEGES non funzionava (a causa della mancanza del privilegio di ricarica). Quindi ho usato debian-sys-maint user su Ubuntu 16.04 per ripristinare i privilegi user.root. È possibile trovare la password di user.debian-sys-maint da questo file

sudo cat /etc/mysql/debian.cnf

Mi hai salvato! GRANT non funzionava né in modalità --skip-grant-tables, quindi entrare come ubuntu-system mi permette di creare di nuovo il mio utente root e di poter aggiornare tutti i privilegi
lunix15

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

Accedi da root utilizzando la rispettiva password, se presente, ed esegui semplicemente il comando precedente su qualunque utente sia.

Per esempio:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;

3
ma se l'utente "root" ha perso i privilegi, allora come può funzionare, l'utente root non ha bisogno di privilegi elevati per farlo? questo non ha funzionato per me.
Terungwa,

3

Basta inserire o aggiornare mysql.usercon il valore Yin ogni colonna privilegi.


2

Se stai usando WAMP sul tuo computer locale (mysql versione 5.7.14) Passaggio 1: apri il file my.ini Passaggio 2: rimuovi il commento da questa riga 'skip-grant-tables' rimuovendo il punto e virgola passaggio 3: riavvia mysql server passaggio 4: avvia la console MySQL passaggio 5:

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

Passaggio 6: problema risolto !!!!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.