2009-11-11 10 views
3

Je me suis connecté à MySQL avec l'option --skip-grant-tables. Mais je ne sais pas comment récupérer tous les privilèges de l'utilisateur root.Comment récupérer tous les privilèges de l'utilisateur root dans MySQL?

Erreur

requête SQL:

GRANT ALL PRIVILEGES ON *. * TO 'root' @ 'localhost';

MySQL dit: Documentation

1290 - Le serveur MySQL est en cours d'exécution avec l'option --skip-grant-tables afin

il ne peut pas exécuter cette instruction

Erreur

requête SQL : Modifier

GRANT ALL PRIVILEGES ON *. * À 'root' @ 'localhost' AVEC MAX_QUERIES_PER_HOUR 0 0 MAX_CONNECTIONS_PER_HOUR MAX_UPDATES_PER_HOUR 0 max_user_connections 0;

MySQL dit: Documentation

1290 - Le serveur MySQL est en cours d'exécution avec l'option --skip-grant-tables afin

il ne peut pas exécuter cette instruction

+1

Il semble y avoir une solution à cette question/réponse http://stackoverflow.com/questions/1709078/how-can-i-restore-the-mysql-root-users-full-privileges –

Répondre

1

Pour exécuter une requête GRANT , il vous suffit ne pas exécuter MySQL avec skip-grant-tables - ce qui est compliqué à ce sujet ...?

+2

il doit avoir les privilèges root. – RageZ

+0

... donc il ne devrait pas utiliser 'skip-grant-tables' - pourquoi voudrait-il jamais que _and_ 'GRANT'? Bien que j'admette que votre approche fonctionne aussi. –

+3

Il semble qu'il ait oublié le mot de passe de l'utilisateur root. – bluszcz

1

Lorsque vous exécutez mysql en utilisant --skip-grant-tables mysql ne vérifie aucune autorisation. Donc, fondamentalement, vous pouvez faire n'importe quoi.

Pour récupérer les privilèges root dont vous auriez besoin d'exécuter une requête dans mysql DB comme celui-ci

select * from user where user = 'root' 

juste pour vérifier si l'utilisateur root est toujours là si ok:

UPDATE user SET Grant_priv = 1, Super_priv = 1 WHERE user = 'root' 

après que vous pouvez redémarrer mysql sans le --skip-grant-tables et l'utilisateur root devrait être en mesure de faire une certaine subvention afin que votre requête devrait fonctionner

4

Si vous ne pouvez pas accéder au serveur mysql en tant que root, vous devez supprimer ou ne pouvez pas restaurer tous les enregistrements racine dans la table mysql.user, supprimez-les tous et ajoutez un nouvel enregistrement.

Vous devez utiliser la fonction mysql PASSWORD() pour hacher votre mot de passe en clair. vérifier pour plus d'informations http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

Arrêtez d'abord le serveur mysql et lancez mysqld avec --skip-grant-tables.

[[email protected] ~]# service mysqld stop; mysqld_safe --skip-grant-tables & 

Découpez votre mot de passe en clair.

mysql> select PASSWORD('CLEARTEXT_PASSWORD'); 
+-------------------------------------------+ 
| PASSWORD('CLEARTEXT_PASSWORD')   | 
+-------------------------------------------+ 
| *1EADAEB11872E413816FE51216C9134766DF39F9 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 

Utilisez la base de données mysql pour appliquer les modifications.

mysql> use mysql; 

Supprimer tous les enregistrements racine

mysql> delete from user where User='root'; 

Ajouter un nouvel enregistrement que l'utilisateur root peut accéder à tous les privilèges de votre adresse IP.

mysql> insert into `user` VALUES('YOUR_IP_ADDRESS','root','*1EADAEB11872E413816FE51216C9134766DF39F9','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','Y','Y','Y','','','','',0,0,0,0,'',''); 

Flush changes.

mysql> FLUSH PRIVILEGES; 

Quittez la ligne de commande mysql.

mysql> exit; 

Redémarrez le service mysqld. Si vous exécutez ces commandes/requêtes mysql, vous obtiendrez un nouvel accès au serveur mysql. Si vous exécutez cette commande/requête mysql, vous obtiendrez un nouvel accès au serveur mysql.

+0

Si l'insertion a du mal à correspondre aux colonnes de privilèges requises, voir la réponse ci-dessous. Copiez une ligne existante si vous avez seulement besoin d'une nouvelle subvention avec, par exemple, une autre colonne hôte autorisée. – user18099

1

Tout d'abord, arrêtez le serveur MySQL, puis démarrer avec l'option --skip-grant-tables.

[[email protected] mysql5.7]# /etc/init.d/mysqld stop 
[[email protected] mysql5.7]# /usr/local/mysql/bin/mysqld_safe --skip-grant-tables --user=mysql 

Ensuite, connectez-vous à votre instance sans mot de passe:

[[email protected] mysql5.7]# mysql -u root 

Ensuite, réinitialiser le mot de passe pour l'utilisateur root.

mysql> flush privileges; 
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY ''; 
mysql> flush privileges; 

Passez en mode normal de MySQL puis connectez-vous sans mot de passe.

0

Si le but de votre --skip-grant-tables est d'insérer une nouvelle subvention, vous pouvez le faire en insérant une ligne dans mysql.user (voir d'autres réponses)

Si votre défi est de donner ce new Accordez tous les privilèges requis (plusieurs colonnes Y/N), vous pouvez ensuite copier une attribution racine existante. Et ajustez seulement ce dont vous avez besoin.

CREATE TEMPORARY TABLE mysql.tmpUser SELECT * FROM mysql.user WHERE host="old" and user="root"; 
UPDATE mysql.tmpUser SET host="new" WHERE user = "root"; 
INSERT INTO mysql.user SELECT * FROM mysql.tmpUser;