338 votos

ERROR 1396 (HY000): La operación CREAR USUARIO falló para 'jack'@'localhost'.

Parece que no puedo recrear un simple usuario que he borrado aunque estoy en MySQL como Root.

Caso especial: el usuario 'jack' existía antes, pero lo borré de mysql.user para recrearlo. No veo ningún vestigio de esto en esa tabla. Si hago este comando para algún otro nombre de usuario aleatorio, digamos 'jimmy', funciona bien (tal como lo hizo originalmente para 'jack').

¿Qué he hecho para corromper el usuario "jack" y cómo puedo deshacer esa corrupción para recrear a "jack" como un usuario válido para esta instalación de MySQL?

Véase una breve demostración a continuación. (Por supuesto, originalmente, hubo mucho tiempo entre la creación de "Jack" y su eliminación.)

Muchas gracias por cualquier comentario o respuesta.

Russ

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)

596voto

tver3305 Puntos 1605

Sí, este bicho está ahí. Sin embargo, encontré una pequeña solución.

  • Suponga que el usuario está ahí, así que deje al usuario
  • Después de borrar el usuario, hay que eliminar los privilegios de mysql
  • Ahora crea el usuario.

Eso debería resolverlo. Asumiendo que queremos crear el usuario admin @ localhost, estos serían los comandos:

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

Saludos

66 votos

Los privilegios de descarga por sí solos no me han funcionado. Si se elimina el usuario se arregla todo. Gracias.

7 votos

Lo mismo para mí. Tuve que dejar el usuario primero.

3 votos

La solución de @QuantumMechanic no me ha funcionado, pero soltar luego el agua sí.

254voto

QuantumMechanic Puntos 7825

Intenta hacer un FLUSH PRIVILEGES . Este mensaje de error de MySQL en ese código de error parece informar de un cierto éxito en un caso similar al suyo después de limpiar los retretes.

15 votos

Había encontrado esta sugerencia y la había probado antes sin éxito, pero quizás algo más estaba mal. Probando ahora mismo de nuevo, y volviendo a crear la situación con otro usuario, he comprobado que, efectivamente, esto ha funcionado. Por supuesto, la respuesta formal de hoy fue "no ser estúpido" y usar REVOKE y DROP USER para hacerlo bien. Estoy en deuda con las tres respuestas (ésta resulta ser la que me sacó del apuro actual).

16 votos

Estamos en 2016, mysql está en la v14.14, y sigue roto.

5 votos

Primero tuve que dar de baja al usuario según la respuesta de @tver3305.

52voto

user1969061 Puntos 161

¿Cómo es que las respuestas incorrectas consiguen tantos votos favorables? Este error ha estado en bugs.mysql.com desde 2007 y este hilo es principalmente un loro de todas esas respuestas erróneas incluso hasta hace un año.

De acuerdo con la documentación de MySQL, comandos como CREATE USER , GRANT , REVOKE y DROP USER no requieren un posterior FLUSH PRIVILEGES comando. Está bastante claro por qué, si uno lee los documentos. Es porque al alterar las tablas de la base de datos de mysql directamente no se recarga la información en la memoria; sin embargo, la plétora de soluciones a este fallo afirman que FLUSH PRIVILEGES es la respuesta. Me gusta una buena teoría de conspiración tanto como a cualquiera, pero esta no es una de ellas.

Puede que ni siquiera sea un bicho. Es una conspiración de documentación - los documentos varían en un lugar crítico de una versión a otra.

13.7.1.2. Sintaxis del usuario de la gota

...

DROP USER usuario [, usuario] ...

...

USUARIO DROP 'jeffrey'@'localhost';

Si se especifica sólo la parte del nombre de usuario del nombre de la cuenta, se utiliza la parte del nombre del host de '%'.

[oh, letra pequeña]

DROP USER como está presente en MySQL 5.0.0 sólo elimina las cuentas que no tienen privilegios. En MySQL 5.0.2, fue modificado para eliminar los privilegios de las cuentas también. Esto significa que el procedimiento para eliminar una cuenta depende de su versión de MySQL.

Como dijo el presidente Reagan: "Confía pero verifica".

A partir de la versión 5.0.2 de MySQL, puedes eliminar una cuenta y sus privilegios de la siguiente manera:

Usuario de DROP USER;

El estado de cuenta elimina las filas de privilegios de la cuenta de todas las mesas de concesión.

La única vez que tengo este error es cuando lo hago DROP USER user como el doctor sugiere, pero MySQL no trata el "%" como un comodín de manera que dejaría caer a todos los usuarios en todos los hosts. No es tan salvaje después de todo. O... puede ser que a veces funcione cuando borra el usuario del host local y luego intenta borrar el de %. Es claro para mí que cuando intenta borrar el usuario en %, emite un mensaje de error y se cierra. Subsiguiente CREATE USER en el localhost fallará porque el usuario del localhost nunca fue eliminado. Parece que no hay necesidad de perder el tiempo buscando fantasmas en las mesas de subvención como un cartel sugirió.

Veo 7 votos a favor:

DROP USER 'jack@localhost'; // eliminar completamente la cuenta

Lo que se interpreta como DROP USER 'jack@localhost'@'%'; # mal

En realidad parece haber un error real que genera el mismo mensaje de error, pero tiene que ver con que el primer usuario creado (después de una nueva instalación de un servidor mysql) se ha caído. Si ese error ha sido corregido, no lo sé; pero no recuerdo que haya sucedido últimamente y estoy hasta la versión 5.5.27 en este momento.

8 votos

¿Es usted un escritor de documentos de MySQL?

0 votos

Esta fue la respuesta para mí. Mariadb ha heredado este error.

0 votos

Por qué no es la respuesta aceptada :/. De todos modos, gracias @user1969061. Esto sí que me ha funcionado en mariadb-server-5.5.60-1.el7_5.x86_64

25voto

Marc B Puntos 195501

No deberías borrar manualmente a los usuarios de esa manera. MySQL tiene REVOKE sintaxis para eliminar los privilegios y DROP USER por borrarlos:

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

Es mejor usar las herramientas que se proporcionan en lugar de andar por ahí en el fondo.

2 votos

Esta era la verdadera respuesta, pero no al problema que tenía (que fue creado por mi estupidez). Muchas gracias por aclararme las cosas.

0 votos

@Marc, Entonces ¿Por qué han inventado flush privileges en primer lugar? La documentación oficial de MySQL hacer hablar de cosas como delete from user where user = 'jack'; y flush privileges . ¿Por qué dice que no forman parte de las herramientas proporcionadas?

1 votos

Como señala @user1969061, 'jack@localhost' probablemente debería ser 'jack'@'localhost' aquí.

9voto

a1ex07 Puntos 23965

pruebe delete from mysql.db where user = 'jack' y luego crear un usuario

1 votos

Esto me ayudó a entender cómo había corrompido mi instalación. Muchas gracias.

0 votos

Lee más abajo el comentario de Fely. Hay más tablas involucradas.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X