Comment puis-je restaurer les pleins privilèges de l'utilisateur root MySQL?

108

J'ai accidentellement supprimé certains des privilèges de mon utilisateur racine MySQL, y compris la possibilité de modifier des tables. Existe-t-il un moyen de restaurer cet utilisateur à son état d'origine (avec tous les privilèges)?

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
la source
1
La deuxième erreur ressemble à un problème de mot de passe. Probablement ma faute en supposant que vous aviez déjà un compte «root» @ «localhost». Réexécutez mysqld avec --skip-grant-tables, et: "DROP USER 'root' @ 'localhost'; GRANT ALL PRIVILEGES ON . TO 'root' @ '%';" au lieu? La meilleure façon de savoir à quel compte vous devez accorder l'accès est d'exécuter "SELECT User, Host FROM mysql.user WHERE User = 'root';" ... cela vous donnera le nom d'hôte à utiliser après @ symbole dans la commande GRANT.
DMI
1
C'est une mauvaise forme pour les mods de marquer le sujet comme hors sujet lorsqu'il n'est pas hors sujet, sauf qu'il peut y avoir un autre site Stack Exchange plus adapté au sujet, auquel cas il doit être identifié. (Honte sur les mods.) Voici où cela pourrait aller: dba.stackexchange.com
Jon Davis
^ d'accord, j'ai voté pour la réouverture. s'il a été fermé en raison de l'existence du site DBA, cela aurait au moins dû être mentionné et le PO dirigé là-bas. (Ou potentiellement fermé comme un double d'une autre question ici)
indivisible

Réponses:

148

Si GRANT ALLcela ne fonctionne pas, essayez:

  1. Arrêtez-le mysqldet redémarrez-le avec l' --skip-grant-tablesoption.
  2. Connectez-vous au mysqldserveur avec juste: mysql(c.-à-d. Aucune -poption et le nom d'utilisateur peut ne pas être requis).
  3. Exécutez les commandes suivantes dans le client mysql:

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

    FLUSH PRIVILEGES;

Après cela, vous devriez pouvoir exécuter GRANT ALL ON *.* TO 'root'@'localhost';et faire fonctionner.

DMI
la source
7
1.Comment se connecter au serveur mysqld avec juste: mysql 2.Lorsque j'ai émis UPDATE mysql.user SET Grant_priv = '1' WHERE User = 'root'; PRIVILÈGES DE RINÇAGE; J'ai obtenu la requête ok, 0 lignes affectées (0,00 s) correspondances: 2 modifiées: 0 avertissements: 0 requête ok, 0 lignes affectées (0,00 s). Lorsque je me suis connecté à phpMyAdmin en tant qu'utilisateur root, je vois toujours "Aucun privilège".
Steven
Désolé, après les étapes ci-dessus, vous devriez pouvoir exécuter la commande GRANT ALL. Pour vous connecter à mysqld, je voulais dire que vous n'aurez pas besoin d'un mot de passe - je ne me souviens pas si un nom d'utilisateur fonctionnera ou s'il devra être "root".
DMI
2
Cela ne fonctionne pas. Comme Steven dit, la mise à jour des effets table utilisateur 0 enregistrements. L'utilisateur root reste incapable d'accorder.
Cerin
1
Oui, ça marche. Et si vous êtes sous Windows, ajoutez simplement temporairement skip-grant-tablesà la [mysqld]section de votre fichier de configuration mysql pour accéder à mysql sur la ligne de commande sans mot de passe.
markus
1
Je suis resté à la partie Grant (qui n'a pas fonctionné) pendant plus de 9 heures et votre réponse m'a sauvé ... vous êtes une bouée de sauvetage.Merci beaucoup
Ali SH
91

Si vous avez supprimé votre rootutilisateur par erreur, vous pouvez faire une chose:

  1. Arrêter le service MySQL
  2. Courir mysqld_safe --skip-grant-tables &
  3. Tapez mysql -u root -pet appuyez sur Entrée.
  4. Tapez votre mot de passe
  5. Sur la ligne de commande mysql, entrez: use mysql;

Puis exécutez cette requête:

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

puis redémarrez le mysqld

EDIT: 6 octobre 2018

Au cas où quelqu'un d'autre aurait besoin de cette réponse, je l'ai essayé aujourd'hui en utilisant innodb_version 5.6.36-82.0 et 10.1.24-MariaDB et cela fonctionne si vous ENLEVEZ LES BACKTICKS (pas de guillemets simples non plus, supprimez-les simplement):

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
la source
1
@Bipin, Bizarre, il n'y a que mysqld.exedans le bindossier, non mysqld_safe.exe. Qu'entendez-vous par "mysqld_safe"?
Pacerier
4
Pour MySQL 5.5, vous avez besoin de deux autres privs, Event_priv et Trigger_priv.
Greg Bell le
J'imagine que cela casse en 5.6.5
Otheus
1
@Pacerier - selon ce post, vous n'avez pas vraiment besoin mysqld_safe, lancez simplement le binaire mysqld normal:mysqld.exe --skip-grant-tables
bkwdesign
2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jamie Hutber
24

je supprime également les privilèges de racine et de base de données n'apparaissant pas dans la console mysql quand j'étais un utilisateur root, donc changé d'utilisateur par mysql>mysql -u 'userName' -p;et mot de passe;

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

FLUSH PRIVILEGES;

après cette commande, tout afficher la base de données à la racine.

Merci

Prabhu
la source
1
J'ai dû faire une combinaison de choses. J'ai dû arrêter le service mysqld, puis exécuter mysqld_safe --skip-crant-tables &, puis la commande UPDATE ci-dessus, puis redémarrer mysql, puis exécuter GRANT ALL ON . À 'utilisateur' @ 'localhost';
Nick Woodhams
5

J'avais refusé les privilèges d'insertion et de rechargement à root. Ainsi, après la mise à jour des autorisations, FLUSH PRIVILEGES ne fonctionnait pas (faute de privilège de rechargement). J'ai donc utilisé l'utilisateur debian-sys-maint sur Ubuntu 16.04 pour restaurer les privilèges user.root. Vous pouvez trouver le mot de passe de user.debian-sys-maint dans ce fichier

sudo cat /etc/mysql/debian.cnf
Varun Kumar
la source
Tu m'as sauvé! GRANT ne fonctionnait pas non plus en mode --skip-grant-tables, donc entrer en tant que système ubuntu me permet de créer à nouveau mon utilisateur root, et que je pourrais mettre à jour tous les privilèges
lunix15
4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

Connectez-vous simplement à partir de la racine en utilisant le mot de passe respectif le cas échéant et exécutez simplement la commande ci-dessus quel que soit l'utilisateur.

Par exemple:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;
inconnus
la source
3
mais si l'utilisateur «root» a perdu ses privilèges, alors comment cela peut-il fonctionner, est-ce que l'utilisateur root n'a pas besoin de privilèges élevés pour faire cela? Cela n'a pas fonctionné pour moi.
Terungwa
3

Insérez simplement ou mettez mysql.userà jour avec la valeur des Yprivilèges de chaque colonne.

user1316095
la source
2

Si vous utilisez WAMP sur votre ordinateur local (mysql version 5.7.14) Étape 1: ouvrez le fichier my.ini Étape 2: annulez le commentaire de cette ligne 'skip-grant-tables' en supprimant le point-virgule étape 3: redémarrez mysql serveur étape 4: lancez la console mySQL étape 5:

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

Étape 6: Problème résolu !!!!

Terungwa
la source