346 votes

ERREUR 1396 (HY000) : L'opération CREATE USER a échoué pour 'jack'@'localhost'.

Il semble que je ne puisse pas recréer un simple utilisateur que j'ai supprimé, même en tant que Root dans MySQL.

Mon cas : l'utilisateur "jack" existait auparavant, mais je l'ai supprimé de mysql.user afin de le recréer. Je ne vois aucun vestige de cette suppression dans cette table. Si j'exécute cette commande pour un autre nom d'utilisateur aléatoire, disons 'jimmy', cela fonctionne bien (tout comme pour 'jack' à l'origine).

Qu'ai-je fait pour corrompre l'utilisateur 'jack' et comment puis-je annuler cette corruption afin de recréer 'jack' comme un utilisateur valide pour cette installation de MySQL ?

Voir l'exemple ci-dessous. (Bien sûr, à l'origine, il y avait beaucoup de temps entre la création de "jack" et sa suppression).

mysql> CREATE USER 'jack'@'localhost' IDENTIFIED BY 'test123';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from user;
+------------------+-----------------+
| user             | host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| jack             | localhost       |
| root             | localhost       |
| root             | russ-elite-book |
+------------------+-----------------+
5 rows in set (0.00 sec)

mysql> delete from user where user = 'jack';
Query OK, 1 row affected (0.00 sec)

mysql> select user,host from user;
+------------------+-----------------+
| user             | host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| root             | localhost       |
| root             | russ-elite-book |
+------------------+-----------------+
4 rows in set (0.00 sec)

mysql> CREATE USER 'jack'@'localhost' IDENTIFIED BY 'test123';
ERROR 1396 (HY000): Operation CREATE USER failed for 'jack'@'localhost'
mysql> CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from user;
+------------------+-----------------+
| user             | host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| jimmy            | localhost       |
| root             | localhost       |
| root             | russ-elite-book |
+------------------+-----------------+
5 rows in set (0.00 sec)

0 votes

Cela explique parfaitement la raison : stackoverflow.com/a/20699933/2377343

622voto

tver3305 Points 1605

oui ce bug est là. Cependant, j'ai trouvé une petite solution de contournement.

  • Supposez que l'utilisateur est là, donc laissez tomber l'utilisateur.
  • Après avoir supprimé l'utilisateur, il est nécessaire de vider les privilèges mysql.
  • Maintenant, créez l'utilisateur.

Cela devrait résoudre le problème. En supposant que nous voulons créer l'utilisateur admin @ localhost, voici les commandes :

drop user admin@localhost;
flush privileges;
create user admin@localhost identified by '_admins\_password_'

Cheers

71 votes

La suppression des privilèges n'a pas fonctionné pour moi. L'abandon de l'utilisateur a tout réglé. Merci.

7 votes

Pareil pour moi. J'ai dû laisser tomber l'utilisateur d'abord.

3 votes

La solution de @QuantumMechanic n'a pas fonctionné pour moi, mais l'abandon puis la chasse d'eau ont fonctionné.

263voto

QuantumMechanic Points 7825

Essayez de faire un FLUSH PRIVILEGES; . Ce billet sur le bug de MySQL sur ce code d'erreur semble rapporter un succès dans un cas similaire au vôtre après avoir purgé les données privées.

16 votes

J'avais trouvé cette suggestion et l'avais déjà essayée sans succès, mais peut-être que quelque chose d'autre n'allait pas. Je viens de l'essayer à nouveau, puis de recréer la situation avec un autre utilisateur, et j'ai constaté que cela faisait l'affaire. Bien sûr, la réponse officielle aujourd'hui était "ne pas être stupide" et utiliser REVOKE et DROP USER pour faire les choses correctement. Je suis redevable à ces trois réponses (il se trouve que c'est celle qui m'a sorti de ma situation actuelle).

16 votes

Nous sommes en 2016, mysql est à la version 14.14, et il est toujours cassé.

5 votes

J'ai d'abord dû supprimer l'utilisateur, conformément à la réponse de @tver3305.

52voto

user1969061 Points 161

Ce bogue se trouve sur bugs.mysql.com depuis 2007 et ce fil de discussion n'est qu'une répétition de toutes ces mauvaises réponses, même il y a un an.

Selon la documentation de MySQL, des commandes comme CREATE USER , GRANT , REVOKE et DROP USER ne nécessitent pas un FLUSH PRIVILEGES commande. La raison est assez claire, si l'on lit la documentation. C'est parce que modifier directement les tables MySQL ne recharge pas les informations en mémoire ; pourtant, la pléthore de solutions à ce bogue prétend que FLUSH PRIVILEGES est la réponse.

Il ne s'agit peut-être même pas d'un bogue. Il s'agit d'une conspiration de la documentation - les documents varient à un endroit critique d'une version à l'autre.

13.7.1.2. Syntaxe DROP USER

...

DROP USER user [, user] ...

...

DROP USER 'jeffrey'@'localhost' ;

Si vous ne spécifiez que la partie nom d'utilisateur du nom de compte, une partie nom d'hôte de '%' est utilisée.

DROP USER tel qu'il est présent dans MySQL 5.0.0 supprime uniquement les comptes qui n'ont aucun privilège. Dans MySQL 5.0.2, elle a été modifiée pour supprimer également les privilèges des comptes. Cela signifie que la procédure de suppression d'un compte dépend de votre version de MySQL.

À partir de MySQL 5.0.2, vous pouvez supprimer un compte et ses privilèges de la manière suivante :

DROP USER utilisateur ;

L'instruction supprime les rangées de privilèges pour le compte de toutes les tables d'attribution.

La seule fois où j'obtiens cette erreur, c'est lorsque je fais DROP USER user comme le suggère la documentation, mais MySQL ne traite pas le '%' comme un caractère générique de manière à supprimer tous les utilisateurs sur tous les hôtes. Ce n'est pas un caractère générique après tout. Ou bien, il se peut que cela fonctionne parfois lorsqu'il supprime l'utilisateur de l'hôte local et qu'il essaie ensuite de supprimer celui de %.

Il est clair pour moi que lorsqu'il tente de supprimer l'utilisateur à %, il affiche un message d'erreur et abandonne. Par la suite, CREATE USER à localhost échouera car l'utilisateur localhost n'a jamais été supprimé. Il ne semble pas nécessaire de perdre du temps à creuser dans les tables de subventions à la recherche de fantômes comme l'a suggéré un poster.

Je vois 7 votes pour :

DROP USER 'jack@localhost' ; // supprime complètement le compte

Ce qui est interprété comme DROP USER 'jack@localhost'@'%'; # wrong

Il semble y avoir un vrai bogue qui génère le même message d'erreur, mais il s'agit de l'abandon du premier utilisateur créé (après une nouvelle installation du serveur mysql). Je ne sais pas si ce bogue a été corrigé, mais je ne me souviens pas que cela se soit produit récemment et j'en suis à la version 5.5.27 pour le moment.

8 votes

Êtes-vous un rédacteur de documents sur MySQL ?

0 votes

C'était la réponse pour moi. Mariadb a hérité de ce bogue.

0 votes

Pourquoi ce n'est pas la réponse acceptée :/. Quoi qu'il en soit, merci à @user1969061. Cela a certainement fonctionné pour moi dans mariadb-server-5.5.60-1.el7_5.x86_64

26voto

Marc B Points 195501

Vous ne devriez pas supprimer manuellement des utilisateurs de cette façon. MySQL a REVOKE syntaxe pour la suppression des privilèges et DROP USER pour les supprimer :

REVOKE priv1,priv2,priv3,etc... FROM 'jack@localhost'; // remove certain privileges
DROP USER 'jack@localhost'; // completely delete the account

Il est préférable d'utiliser les outils fournis plutôt que de s'occuper de l'arrière-plan.

2 votes

C'était la vraie réponse, mais pas au problème que j'avais (qui avait été créé par ma stupidité). Merci beaucoup de m'avoir remis à l'endroit !

0 votes

@Marc, Puis pourquoi ont-ils même inventé flush privileges en premier lieu ? La documentation officielle de MySQL faire parler de choses comme delete from user where user = 'jack'; et flush privileges . Pourquoi dites-vous qu'ils ne font pas partie des outils fournis ?

1 votes

Comme le souligne @user1969061, 'jack@localhost' devrait probablement être 'jack'@'localhost' ici.

13voto

罗俊峰 Points 31

Supprimez l'utilisateur, supprimez les privilèges, puis créez l'utilisateur. Cela fonctionne !

2 votes

La purge des privilèges seule n'a pas fonctionné jusqu'à ce que je supprime l'utilisateur. Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X