Comment accorder tous les privilèges à l'utilisateur root dans MySQL 8.0

112

A essayé

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

Obtenir

ERREUR 1064 (42000): vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de 'IDENTIFIED BY' root 'WITH GRANT OPTION' à la ligne 1.

Remarque: le même fonctionne lorsqu'il est essayé dans les versions précédentes.

Également essayé

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Obtenir

ERREUR 1410 (42000): vous n'êtes pas autorisé à créer un utilisateur avec GRANT

Le nom d'utilisateur / mot de passe MySQL (8.0.11.0) est root / root.

Praveen
la source
vous connectez-vous directement avec mysql ou utilisez-vous ssh?
Harald
directement à partir de l'invite de commande en tant qu'utilisateur root
Praveen
1
Voir les différences entre la syntaxe GRANT 13.7.1.6 et la syntaxe GRANT 13.7.1.4 .
wchiquito
7
Im trop coincé avec le même problème. Je lance le shell mysql en utilisant mysql -u root -p, puis en entrant le mot de passe root. Ensuite, j'ai essayé GRANT GRANT OPTION ON *.* TO 'root'@'%';et j'obtiens l'erreurERROR 1410 (42000): You are not allowed to create a user with GRANT
aiman

Réponses:

199

À partir de MySQL 8, vous ne pouvez plus (implicitement) créer un utilisateur à l'aide de la GRANTcommande. Utilisez plutôt CREATE USER , suivi de l' instruction GRANT :

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Attention aux risques de sécurité liés à WITH GRANT OPTION, voir:

Mike Lischke
la source
3
Cette commande créera un nouvel utilisateur. Mais je souhaite accorder des privilèges à l'utilisateur root existant. mysql> CREATE USER 'root' @ '%' IDENTIFIED BY 'root'; Requête OK, 0 ligne affectée (0,31 sec) mysql> GRANT ALL PRIVILEGES ON . TO 'root' @ '%' AVEC L'OPTION GRANT; Requête OK, 0 lignes affectées (0,16 sec) mysql> SELECT User FROM mysql.user; + ------------------ + | Utilisateur | + ------------------ + | racine | | mysql.infoschema | | mysql.session | | mysql.sys | | racine | + ------------------ + 5 lignes dans le set (0,00 sec)
Praveen
Maintenant, deux utilisateurs avec le nom root sont présents dans la table des utilisateurs !! De plus, je ne peux pas me connecter à distance (utilisateur root). ------------- Détails: Type: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException État SQL: 08001
Praveen
Bizarre. Le message d'erreur dans votre question indique que cet utilisateur n'existe pas. C'est la seule raison pour laquelle j'ai suggéré de le créer en premier. Et il est impossible d'avoir le même utilisateur deux fois dans une seule instance MySQL. Ils diffèrent soit par le nom, soit par la partie hôte.
Mike Lischke
2
Ces 2 utilisateurs se connectent depuis différents hôtes. Courez à la SELECT User, Host FROM mysql.user;place.
Mike Lischke
3
Vous avez cette erreur:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi le
31

1) Cela a fonctionné pour moi. Tout d'abord, créez un nouvel utilisateur. Exemple: utilisateur fooavec mot de passebar

> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';

2) Remplacez le code ci-dessous par un nom d'utilisateur avec «foo».

> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';

Remarque: database_name est la base de données que vous voulez avoir des privilèges, . signifie tout sur tous

3) Connectez-vous en tant qu'utilisateur foo

mysql> mysql -u foo -p

Mot de passe: bar

4) Assurez-vous que votre connexion initiale depuis Sequelize est définie sur foo avec pw bar.

J. Doe
la source
5
Cela ne répond de loin pas à la question. Il s'agit d'autorisations globales et non d'autorisations spécifiques à la base de données.
tmuecksch
29

Je vois beaucoup de (mauvaises) réponses, c'est aussi simple que ceci:

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

Remarque: au lieu d'un auto-créé, uservous pouvez utiliser rootpour vous connecter à la base de données. Cependant, l'utilisation du compte racine par défaut pour permettre à une application de se connecter à la base de données n'est pas la méthode préférée.

Privilèges alternatifs (soyez prudent et rappelez-vous le principe du moindre privilège):

-- Grant user permissions to all tables in my_database from localhost --
GRANT ALL ON my_database.* TO 'user'@'localhost';

-- Grant user permissions to my_table in my_database from localhost --
GRANT ALL ON my_database.my_table TO 'user'@'localhost';

-- Grant user permissions to all tables and databases from all hosts --
GRANT ALL ON *.* TO 'user'@'*';

Si vous rencontriez en quelque sorte l'erreur suivante:

ERREUR 1130 (HY000): l'hôte '1.2.3.4' n'est pas autorisé à se connecter à ce serveur MySQL

Vous devez ajouter / modifier les deux lignes suivantes /etc/mysql/my.cnfet redémarrer mysql:

bind-address           = 0.0.0.0
skip-networking
Nébulastique
la source
Pourriez-vous expliquer pourquoi cela ne fonctionne pas au lieu de simplement vous plaindre? De cette façon, je peux vous aider ou publier des informations supplémentaires.
Nébulastique
Cette réponse ne répond même pas en quelque sorte à la question des privilèges de l'utilisateur root .
Joseph
Mise à jour de la réponse en conséquence.
Nébulastique
1
Meilleure réponse, maintenant c'est GRANT ALL ONpour MySQL 8.0. Aussi, je crois qu'au lieu de désactiver, bind-addressvous pouvez vous lier 127.0.0.1et inclure --protocol=tcpdans toutes les commandes. La performance à long terme est également meilleure qu'avec localhost.
Jesse Nickles
3

Mes spécifications:

mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

Ce qui a fonctionné pour moi:

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;

Réponse dans les deux requêtes:

Query OK, O rows affected (0.10 sec*)

NB: J'ai créé une base de données (db_name) plus tôt et je créais un identifiant d'utilisateur avec tous les privilèges accordés à toutes les tables de la base de données au lieu d'utiliser l'utilisateur root par défaut que j'ai lu quelque part est une bonne pratique.

Nuel Makara
la source
3

L'utilisateur spécifié n'existe tout simplement pas sur votre MySQL (donc, MySQL essaie de le créer avec GRANT comme il le faisait avant la version 8, mais échoue avec les limitations, introduites dans cette version).

MySQL est assez stupide à ce stade, donc si vous avez 'root' @ 'localhost' et que vous essayez d'accorder des privilèges à 'root' @ '%', il les traite comme des utilisateurs différents, plutôt que comme une notion généralisée pour l'utilisateur root sur n'importe quel hôte, y compris localhost.

Le message d'erreur est également trompeur.

Donc, si vous obtenez le message d'erreur, vérifiez vos utilisateurs existants avec quelque chose comme ça

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;

puis créez l'utilisateur manquant (comme Mike l'a conseillé) ou ajustez votre commande GRANT à la spécificaion réelle de l'utilisateur existant.

Sergey Podushkin
la source
C'était une solution valable pour moi! J'avais simplement échoué à taper la ligne user @ avec précision. Assurez-vous de vérifier cela avant d'essayer les autres solutions suggérées. Pour moi, c'était: CREATE USER 'user'@'%domain.com' et ensuite, lorsque j'ai émis l'instruction GRANT défaillante, ma syntaxe était décalée d'un '.'. Cela ressemblait à ceci GRANT .... TO 'user'@'%.domain.com'. J'ai oublié de mettre le '.' dans ma déclaration de création et cela a fait toute la différence pour résoudre ce problème.
wallisds
2

Juste mes 2 cents sur le sujet. J'avais exactement le même problème en essayant de me connecter à partir de MySQL Workbench. J'exécute une machine virtuelle bitnami-mysql pour configurer un bac à sable local pour le développement.

Le tutoriel de Bitnami dit d'exécuter la commande 'Accorder tous les privilèges':

/opt/bitnami/mysql/bin/mysql -u root -p -e "grant all privileges on *.* to 'root'@'%' identified by 'PASSWORD' with grant option";

Cela ne fonctionnait clairement pas, je l'ai finalement fait fonctionner en utilisant la réponse de Mike Lischke.

Je pense que ce qui s'est passé, c'est que l'utilisateur root @% avait des informations d'identification incorrectes associées. Donc, si vous avez essayé de modifier les privilèges de l'utilisateur et sans succès, essayez:

  1. Suppression de l'utilisateur.
  2. Créez à nouveau l'utilisateur.
  3. Assurez-vous d'avoir la liaison correcte sur votre fichier de configuration my.cnf. Dans mon cas, j'ai commenté la ligne car c'est juste pour un environnement sandbox.

Depuis la console Mysql:

Liste des utilisateurs (utile pour voir tous vos utilisateurs):

select user, host from mysql.user;

Supprimer l'utilisateur souhaité:

drop user '{{ username }}'@'%';

Créer un utilisateur et accorder des autorisations:

CREATE USER '{{ username }}'@'%' IDENTIFIED BY '{{ password }}';
GRANT ALL PRIVILEGES ON *.* TO '{{ username }}'@'%' WITH GRANT OPTION;

Exécutez cette commande:

FLUSH PRIVILEGES;

Localisez votre fichier de configuration mysql 'my.cnf' et recherchez une ligne qui ressemble à ceci:

bind-address=127.0.0.1

et commentez-le en utilisant un '#':

#bind-address=127.0.0.1

Ensuite, redémarrez votre service mysql.

J'espère que cela aide quelqu'un ayant le même problème!

Armando Juarez
la source
1

Cela a fonctionné pour moi:

mysql> FLUSH PRIVILEGES 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES
ZÉRO
la source
1

Vérifiez que votre nom d'utilisateur et votre domaine sont identiques à ceux créés précédemment. MySQL sélectionne le compte par les deux colonnes de la table des utilisateurs.Si c'est différent, mysql peut penser que vous souhaitez créer un nouveau compte par concession, ce qui n'est pas pris en charge après la version 8.0.

zenglong chen
la source
1

Mes spécifications:

mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

Ce qui a fonctionné pour moi:

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';
尹劍平
la source
Bien que cela fonctionne dans votre situation spécifique. Cette partie de la syntaxe SQL met à jour un utilisateur et ne définit pas de compte utilisateur. Il n'accorde pas non plus de privilèges.
Nébulastique
0

Eh bien, j'ai juste eu le même problème. Même si la route avait '%' ne pouvait pas se connecter à distance. Maintenant, en regardant le my.inifichier (fichier de configuration dans Windows), l' bind-addressinstruction a été manquée.

Alors ... j'ai mis ça bind-address = *après [mysqld]et redémarré le service. Maintenant ça marche!

Caos51
la source
C'est en fait la plus proche de la bonne réponse.
Joseph
0

1. accorder des privilèges

mysql> ACTIVER TOUS LES PRIVILÈGES. TO 'root' @ '%' AVEC L'OPTION GRANT;

mysql> FLUSH PRIVILEGES

2. vérifier la table des utilisateurs:

mysql> utilisez mysql

mysql> sélectionner l'hôte, l'utilisateur de l'utilisateur entrez la description de l'image ici

3.Modifiez le fichier de configuration

mysql default bind ip : 127.0.0.1, si nous voulons visiter les services à distance, supprimez simplement la configuration

#Modify the configuration file
vi /usr/local/etc/my.cnf

#Comment out the ip-address option
[mysqld]
# Only allow connections from localhost
#bind-address = 127.0.0.1

4. redémarrer définitivement les services

les services de brassage redémarrent mysql

devo chen
la source
Bien que cela fonctionne, je ne redémarrerais jamais une instance mysql en production lors de l'octroi de certains privilèges. Essayez plutôt de vider les privilèges.
Nebulastic
-1

Cela peut fonctionner:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';
Anup Joshi
la source
1
Plutôt que de jeter du code, expliquez également pourquoi c'est la solution appropriée. Le but est d'éduquer afin que le PO sache quoi faire la prochaine fois, et pas simplement de résoudre le problème immédiat.
The Tin Man le
-1

J'ai eu ce même problème, qui m'a conduit ici. En particulier, pour le développement local, je voulais pouvoir m'en mysql -u root -ppasser sudo. Je ne veux pas créer un nouvel utilisateur. Je souhaite utiliser à rootpartir d'une application Web PHP locale.

Le message d'erreur est trompeur, car il n'y avait rien de mal avec les 'root'@'%'privilèges d'utilisateur par défaut .

Au lieu de cela, comme plusieurs personnes l'ont mentionné dans les autres réponses, la solution était simplement de définir bind-address=0.0.0.0au lieu de bind-address=127.0.0.1dans ma /etc/mysql/mysql.conf.d/mysqld.cnfconfiguration. Aucun changement n'était par ailleurs requis.

Joseph8ème
la source
Cela ne répond même pas complètement à la question.
Nébulastique
-2

J'ai eu le même problème sur CentOS et cela a fonctionné pour moi (version: 8.0.11):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
user3563950
la source
ERREUR 1064 (42000): vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la bonne syntaxe à utiliser à proximité de '. TO 'root' @ '%' 'à la ligne 1
GDefender
mysql> ACTIVER TOUS LES PRIVILÈGES. Enraciner'@'%'; ERREUR 1064 (42000): vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la bonne syntaxe à utiliser à proximité de '. TO 'root' @ '%' 'à la ligne 1 mysql>
PGOEL