338 votos

ERROR 1396 (HY000): La operación CREATE USER falló para 'jack'@'localhost'

Parece que no puedo recrear un usuario simple que he eliminado, incluso como root en MySQL.

Mi caso: el usuario 'jack' existía antes, pero lo eliminé de mysql.user para recrearlo. No veo vestigios de esto en esa tabla. Si ejecuto este comando para otro nombre de usuario al azar, digamos 'jimmy', funciona bien (al igual que lo hacía originalmente para 'jack').

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

Ver ejemplo a continuación. (Por supuesto, originalmente, hubo mucho tiempo entre la creación de 'jack' y su eliminación.)

mysql> CREATE USER 'jack'@'localhost' IDENTIFIED BY 'test123';
Consultado OK, 0 filas afectadas (0.00 seg)

mysql> select user,host from user;
+------------------+-----------------+
| usuario          | host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| jack             | localhost       |
| root             | localhost       |
| root             | russ-elite-book |
+------------------+-----------------+
5 filas en el conjunto (0.00 seg)

mysql> delete from user where user = 'jack';
Consulta OK, 1 fila afectada (0.00 seg)

mysql> select user,host from user;
+------------------+-----------------+
| usuario          | host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| root             | localhost       |
| root             | russ-elite-book |
+------------------+-----------------+
4 filas en el conjunto (0.00 seg)

mysql> CREATE USER 'jack'@'localhost' IDENTIFIED BY 'test123';
ERROR 1396 (HY000): Operación CREATE USER fallida para 'jack'@'localhost'
mysql> CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
Consultado OK, 0 filas afectadas (0.00 seg)

mysql> select user,host from user;
+------------------+-----------------+
| usuario          | host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| jimmy            | localhost       |
| root             | localhost       |
| root             | russ-elite-book |
+------------------+-----------------+
5 filas en el conjunto (0.00 seg)

596voto

tver3305 Puntos 1605

Sí, ese error está ahí. Sin embargo, encontré una pequeña solución alternativa.

  • Supongamos que el usuario está ahí, por lo que eliminamos al usuario
  • Después de eliminar al usuario, es necesario limpiar los privilegios de mysql
  • Ahora creamos el usuario.

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

drop user admin@localhost;
flush privileges;
create user admin@localhost identified by '_contraseña\_admin_'

66 votos

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

7 votos

Igual para mí. Tuve que eliminar primero al usuario.

3 votos

La solución de @QuantumMechanic no funcionó para mí, pero la de borrar y luego vaciar sí.

254voto

QuantumMechanic Puntos 7825

Intenta hacer un FLUSH PRIVILEGES;. Este post de bug de MySQL sobre ese código de error parece informar de cierto éxito en un caso similar al tuyo después de hacer flush de los privilegios.

15 votos

Había encontrado esta sugerencia y la probé anteriormente sin éxito, pero quizás algo más estaba mal. Al intentarlo nuevamente ahora, luego de recrear la situación con otro usuario, descubrí que de hecho funcionaba. Por supuesto, la respuesta formal hoy era "no ser estúpido" y usar REVOKE y DROP USER para hacerlo correctamente. Estoy agradecido por las tres respuestas (esta simplemente resultó ser la que me sacó de mi presente predicamento).

16 votos

Es 2016, mysql está en v14.14, y todavía está roto.

5 votos

Primeramente necesité eliminar al usuario según la respuesta de @tver3305.

52voto

user1969061 Puntos 161

Este bug ha estado presente en bugs.mysql.com desde 2007 y este hilo es principalmente solo una repetición de todas esas respuestas incorrectas incluso hasta hace un año.

Según la documentación de MySQL, comandos como CREATE USER, GRANT, REVOKE y DROP USER no requieren un comando posterior de FLUSH PRIVILEGES. Es bastante claro por qué, si uno lee la documentación. Es porque alterar las tablas de MySQL directamente no recarga la información en memoria; sin embargo, la multitud de soluciones a este bug afirman que FLUSH PRIVILEGES es la respuesta.

Esto puede que ni siquiera sea un bug. 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 de DROP USER

...

DROP USER usuario [, usuario] ...

...

DROP USER 'jeffrey'@'localhost';

Si solo especificas la parte del nombre de usuario de la cuenta, se utiliza una parte del nombre de host de '%'.

DROP USER como se presenta en MySQL 5.0.0 elimina solo cuentas que no tienen privilegios. En MySQL 5.0.2, fue modificado para eliminar también los privilegios de la cuenta. Esto significa que el procedimiento para eliminar una cuenta depende de tu versión de MySQL.

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

DROP USER usuario;

La declaración elimina filas de privilegio para la cuenta de todas las tablas de concesión.

La única vez que recibo este error es cuando hago DROP USER usuario; como sugiere la documentación, pero MySQL no trata el '%' como un comodín de una manera que eliminaría a todos los usuarios en todos los hosts. No es tan salvaje después de todo. O puede ser que a veces funcione cuando eliminan el usuario de localhost y luego intentan eliminar el de %.

Está claro para mí que cuando intenta eliminar el usuario de %, emite un mensaje de error y se detiene. La ejecución de CREATE USER en localhost fallará porque el usuario de localhost nunca fue eliminado. No parece ser necesario desperdiciar tiempo buscando fantasmas en las tablas de concesión como sugirió un usuario.

Veo 7 votos para:

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

Que es interpretado como DROP USER 'jack@localhost'@'%'; # incorrecto

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

8 votos

¿Eres un escritor de documentos de MySQL?

0 votos

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

0 votos

¿Por qué esta no es la respuesta aceptada :/. De todos modos, gracias @user1969061. Definitivamente funcionó para mí en mariadb-server-5.5.60-1.el7_5.x86_64

25voto

Marc B Puntos 195501

No deberías estar eliminando usuarios manualmente de esa manera. MySQL tiene una sintaxis REVOKE para quitar privilegios y DROP USER para eliminarlos:

REVOKE priv1,priv2,priv3,etc... FROM 'jack@localhost'; // quitar ciertos privilegios
DROP USER 'jack@localhost'; // eliminar completamente la cuenta

Es mejor utilizar las herramientas proporcionadas en lugar de meternos en el fondo del asunto.

2 votos

Esta fue la respuesta correcta, pero no para el problema que estaba teniendo (el cual fue creado por mi estupidez). ¡Muchas gracias por corregirme!

0 votos

@Marc, entonces, ¿por qué inventaron flush privileges en primer lugar? La documentación oficial de MySQL habla de cosas como delete from user where user = 'jack'; y flush privileges. ¿Por qué dices que no son parte de las herramientas proporcionadas?

1 votos

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

9voto

a1ex07 Puntos 23965

Intenta delete from mysql.db where user = 'jack' y luego crea un usuario

1 votos

Esto fue útil en ayudarme a entender cómo había corrompido mi instalación. Muchas gracias.

0 votos

Sigue leyendo el comentario de Fely más abajo. 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