346 votes

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

Il semble que je sois incapable de recréer un utilisateur simple 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 aucune trace de cela dans cette table. Si j'exécute cette commande pour un autre nom d'utilisateur, disons 'jimmy', cela fonctionne bien (tout comme cela l'a fait à l'origine pour 'jack').

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

Voir l'exemple ci-dessous. (Bien sûr, 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 la raison excellentement : 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 supprimez l'utilisateur
  • Après avoir supprimé l'utilisateur, il est nécessaire de vider les privilèges mysql
  • Créez maintenant l'utilisateur.

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

drop user admin@localhost;
flush privileges;
create user admin@localhost identified by '_mot\_de\_passe\_admin_'

71 votes

Flushing privileges alone didn't work for me. dropping the user fixed everything. Thanks.

7 votes

Même pour moi. J'ai dû d'abord abandonner l'utilisateur.

3 votes

La solution de @QuantumMechanic n'a pas fonctionné pour moi mais la suppression puis le vidage ont fonctionné.

263voto

QuantumMechanic Points 7825

Essayez de faire un FLUSH PRIVILEGES;. Ce message de bug MySQL sur ce code d'erreur semble signaler un certain succès dans un cas similaire au vôtre après avoir vidé les privilèges.

16 votes

J'avais trouvé cette suggestion et l'avais essayée plus tôt sans succès, mais peut-être que quelque chose d'autre n'allait pas. En la réessayant juste maintenant, puis en recréant la situation avec un autre utilisateur, j'ai constaté que cela avait effectivement fonctionné. Bien sûr, la réponse formelle aujourd'hui était "ne pas être stupide" et utiliser REVOKE et DROP USER pour le faire correctement. Je suis redevable à ces trois réponses (celle-ci se trouve être celle qui m'a sorti de ma situation actuelle).

16 votes

C'est 2016, mysql est à la v14.14, et c'est toujours cassé.

5 votes

J'ai d'abord dû supprimer l'utilisateur selon la réponse de @tver3305.

52voto

user1969061 Points 161

Ce bug est présent sur bugs.mysql.com depuis 2007 et ce fil de discussion n'est principalement qu'une répétition de toutes les mauvaises réponses même jusqu'à il y a un an.

Selon la documentation MySQL, les commandes comme CREATE USER , GRANT , REVOKE et DROP USER ne nécessitent pas de commande FLUSH PRIVILEGES . Il est tout à fait clair pourquoi, si 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 bug prétend que FLUSH PRIVILEGES est la réponse.

Il se peut aussi que ce ne soit même pas un bug. Il s'agit d'une conspiration documentaire - les documents diffèrent en un endroit critique d'une version à l'autre.

13.7.1.2. Syntaxe DROP USER

...

DROP USER utilisateur [, utilisateur] ...

...

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 comme présent dans MySQL 5.0.0 ne supprime que les comptes sans privilèges. Dans MySQL 5.0.2, il a été modifié pour supprimer également les privilèges du compte. 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;

La déclaration supprime les lignes de privilèges pour le compte de toutes les tables de bénéfice.

La seule fois où j'obtiens cette erreur, c'est lorsque je fais DROP USER utilisateur ; comme le suggère le document, mais MySQL ne traite pas le '%' comme un joker de manière à supprimer tous les utilisateurs sur tous les hôtes. Ce n'est pas si sauvage après tout. Ou, il se peut que ça marche parfois quand il supprime l'utilisateur localhost et essaye ensuite de supprimer celui à %.

Il est clair pour moi que lorsqu'il essaie de supprimer l'utilisateur à %, il émet un message d'erreur et s'arrête. La commande CREATE USER ultérieure à localhost échouera car l'utilisateur localhost n'a jamais été supprimé. Il semble inutile de perdre du temps à chercher des fantômes dans les tables de bénéfice comme l'a suggéré un intervenant.

Je vois 7 votes pour:

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

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

Il semble en fait y avoir un vrai bug qui génère le même message d'erreur, mais il concerne le premier utilisateur créé (après une nouvelle installation du serveur mysql) qui est supprimé. Que ce bug ait été corrigé, je ne sais pas; mais je ne me rappelle pas que cela se soit produit récemment et je suis actuellement à la ver 5.5.27.

8 votes

Etes-vous un rédacteur de documentation MySQL ?

0 votes

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

0 votes

Pourquoi cette réponse n'est-elle pas 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 les utilisateurs de cette manière. MySQL dispose de la syntaxe REVOKE pour supprimer les privilèges et DROP USER pour les supprimer :

REVOKE priv1,priv2,priv3,etc... FROM 'jack@localhost'; // supprimer certains privilèges
DROP USER 'jack@localhost'; // supprimer complètement le compte

Il vaut mieux utiliser les outils fournis plutôt que manipuler en arrière-plan.

2 votes

C'était la vraie réponse, mais pas à mon problème (qui a été causé par ma bêtise). Merci beaucoup de m'avoir remis dans le droit chemin!

0 votes

@Marc, Alors, pourquoi ont-ils même inventé flush privileges en premier lieu ? La documentation officielle de MySQL parle 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

Supprimer l'utilisateur, vider les privilèges; puis, créer l'utilisateur. Ça fonctionne!

2 votes

Flushing des privilèges seul n'a pas fonctionné jusqu'à ce que j'ai supprimé 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