ERROR 1396 (HY000): Error en la operación CREAR USUARIO para 'jack' @ 'localhost'

311

Parece que no puedo volver a crear 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 mesa. Si ejecuto este comando para otro nombre de usuario aleatorio, digamos 'jimmy', funciona bien (tal como lo hizo originalmente para 'jack').

¿Qué he hecho para dañar el 'jack' del usuario y cómo puedo deshacer ese daño para volver a crear el 'jack' como un usuario válido para esta instalación de MySQL?

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

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)
Russ Bateman
fuente

Respuestas:

233

Intenta hacer un FLUSH PRIVILEGES;. Esta publicación de error de MySQL en ese código de error parece informar algo de éxito en un caso similar al suyo después de enjuagar privs. 

Mecánica cuántica
fuente
13
Encontré esta sugerencia y la probé antes sin éxito, pero quizás algo más estaba mal. Al intentarlo de nuevo ahora, y luego volver a crear la situación con otro usuario, descubrí que esto realmente funcionó. 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 (esta es la que me rescató de mi situación actual).
Russ Bateman el
13
Es 2016, mysql está en v14.14, y todavía está roto.
ivo Welch
44
Primero necesitaba dejar al usuario según la respuesta de @ tver3305.
Shautieh
99
Estoy viendo el mismo problema con 10.1.21, pero los "privilegios de descarga" no hicieron ninguna diferencia. Dejo caer al usuario, lo enjuago y luego creo, lo que falla con "ERROR 1396 (HY000) en la línea 7: la operación CREAR USUARIO falló por ...". Desearía poder obtener mysql / mariadb para elaborar un poco sobre ese error, como POR QUÉ falló.
David M. Karr
3
Obtuve el error incluso cuando trato de eliminar al usuario también, los 'privilegios de descarga' no funcionaron para mí, después de investigar un poco, encontré la solución al revocar todo acceso y eliminar al usuario, no lo creo. , la operación de descarga ayudará en casos similares, he compartido mi explicación detallada en esta página rathishkumar.in/2018/10/…
Rathish
545

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

  • Suponga que el usuario está allí, así que suelte al usuario
  • Después de eliminar al usuario, es necesario eliminar los privilegios de mysql
  • Ahora crea el usuario.

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

soltar usuario admin @ localhost;
privilegios de descarga;
crear usuario admin @ localhost identificado por ' admins_password '

Salud

tver3305
fuente
58
Los privilegios de descarga por sí solos no funcionaron para mí. dejar caer al usuario solucionó todo. Gracias.
Jake
3
Lo mismo para mi. Primero tuve que soltar al usuario.
kgiannakakis
3
La solución @QuantumMechanic no funcionó para mí, pero soltó y luego sí.
placas de
En mi caso, solo dejar caer a un usuario era enogh, sin privilegios de vaciado.
Scadge
Este fue un ENORME salvavidas, ya que con @Jake encima de la parte clave estaba el usuario de caída con la parte localhost
kellyfj
46

Este error ha estado presente en bugs.mysql.com desde 2007 y este hilo es principalmente un loro de todas esas respuestas incorrectas, incluso hasta hace un año.

De acuerdo con la documentación de MySQL, comandos como CREATE USER, GRANT, REVOKE, y DROP USERno requieren una posterior FLUSH PRIVILEGEScomandos. Está bastante claro por qué, si uno lee los documentos. Es porque alterar las tablas de MySQL directamente no vuelve a cargar la información en la memoria; Sin embargo, la gran cantidad de soluciones a este error afirma que esa FLUSH PRIVILEGESes la respuesta.

Esto tampoco puede ser un error. 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 USUARIO DE GOTA

...

DROP USER usuario [, usuario] ...

...

DROP USER 'jeffrey' @ 'localhost';

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

DROP USERcomo está presente en MySQL 5.0.0 elimina solo las cuentas que no tienen privilegios. En MySQL 5.0.2, también se modificó para eliminar los privilegios de la cuenta. Esto significa que el procedimiento para eliminar una cuenta depende de su versión de MySQL.

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

Usuario de DROP USER;

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

La única vez que recibo este error es cuando lo hago DROP USER user; como sugiere el documento, pero MySQL no trata el '%' como un comodín de una manera que dejaría caer a todos los usuarios en todos los hosts. No es tan salvaje después de todo. O bien, puede ser que a veces funcione cuando elimina el usuario localhost y luego intenta eliminarlo en%.

Para mí está claro que cuando intenta eliminar al usuario en%, emite un mensaje de error y se cierra. Posteriormente CREATE USERen localhost fallará porque el usuario localhost nunca se eliminó. Parece que no hay necesidad de perder el tiempo cavando en las tablas de subvenciones en busca de fantasmas, como sugiere un póster.

Veo 7 votos por:

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

Que se interpreta como DROP USER 'jack@localhost'@'%';# incorrecto

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

usuario1969061
fuente
8
¿Eres un escritor de documentos MySQL?
Pacerier
Esta fue la respuesta para mí. Mariadb ha heredado este error.
zerpsed
¿Por qué no es esta la respuesta aceptada: /. De todos modos, gracias @ user1969061. Esto sin duda trabajó para mí enmariadb-server-5.5.60-1.el7_5.x86_64
Han Solo
36

Si usa una DELETEdeclaración en la mysql.usertabla en un intento de eliminar un usuario, luego intente restablecer el usuario CREATE USER, obtendrá un 1396error. Deshágase de este error ejecutandoDROP USER 'username'@'host';

DELETE 
  FROM mysql.user 
 WHERE user = 'jack';

(Obtendrá 1396 errores si intenta volver a crear jack)

CREATE USER 'jack'@'localhost' IDENTIFIED BY PASSWORD '*Fi47ytFF3CD5B14E7EjkjkkC1D3F8086A5C0-krn';

(Sal de esta situación corriendo DROP USER)

DROP USER 'jack'@'localhost';

(Supongo FLUSH PRIVILEGESque no puede doler, pero definitivamente deje caer al usuario primero).

Anthony Rutledge
fuente
24

No deberías eliminar manualmente a los usuarios de esa manera. MySQL tiene REVOKEsintaxis para eliminar privilegios y DROP USERpara eliminarlos:

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

Lo mejor es usar las herramientas proporcionadas en lugar de buscar en el fondo.

Marc B
fuente
2
Esta fue la verdadera respuesta, pero no al problema que estaba teniendo (que fue creado por mi estupidez). ¡Muchas gracias por aclararme!
Russ Bateman el
@Marc, entonces , ¿por qué inventaron flush privilegesen primer lugar? La documentación oficial de MySQL hacen hablar de cosas por el estilo delete from user where user = 'jack'; y flush privileges. ¿Por qué dice que no son parte de las herramientas proporcionadas?
Pacerier
1
Como @ user1969061 señala, 'jack@localhost'probablemente debería estar 'jack'@'localhost'aquí.
jochen
11

Descarte al usuario, elimine los privilegios; luego, crea el usuario. Funciona!

罗俊峰
fuente
1
Los privilegios de vaciado por sí solos no funcionaron hasta que eliminé al usuario. Gracias.
Brandon Fitzpatrick
10

intente delete from mysql.db where user = 'jack'y luego cree un usuario

a1ex07
fuente
1
Esto fue útil para ayudarme a comprender cómo había dañado mi instalación. Muchas gracias.
Russ Bateman el
Lea más abajo el comentario de Fely. Hay más mesas involucradas.
Prisionero 13 de
6

En MySQL 5.6 el uso Drop user userid;no funciona. Uso: Drop user 'userid'@'localhost';y / o Drop user 'userid'@'%';. De esta manera pude soltar al usuario y recrearlo.

Joilson Cardoso
fuente
5
two method 
one :
setp 1: drop user 'jack'@'localhost';
setp 2: create user 'jack'@localhost identified by 'ddd';

two:
setp 1: delete from user where user='jack'and host='localhost';
setp 2: flush privileges;
setp 3: create user 'jack'@'localhost' identified by 'ddd';
TonyWu
fuente
5

Comprueba si es

'usuario'@'%'

o

'usuario' @ 'localhost'

Inês Gomes
fuente
4

Si desea eliminar un usuario con SQL, es necesario eliminar los datos relacionados en estas tablas: columns_priv, db, procs_priv, tables_priv. Luego ejecutaflush privileges;

fely
fuente
¡¡Buena respuesta!! Su respuesta expone el problema "detrás de escena" de lo que realmente está sucediendo en lugar de simplemente "Use este parche y listo". Me gustan los dos tipos de respuestas incluidas todas juntas, así puedo entenderlo desde la sopa hasta las nueces. Ahora sé cuánto trabajo es hacerlo de esta manera si vas a hacerlo bien, y eso refuerza aún más por qué uno debería usar los métodos descritos por otros. ¡Increíble! Aunque muchas de las respuestas anteriores fueron buenas, le doy mi voto porque sé lo que es ser un recién llegado a este sitio. Hacen que sea muy difícil ayudar a otros cuando eres nuevo.
Prisionero 13 de
Esta debería ser una respuesta alternativa aceptada. Estoy usando mysql 5.5 y DROP USER IF EXISTS aún no está disponible, así que tengo que usar la sintaxis DELETE FROM (primero tengo que probar la existencia del usuario). Eliminar solo de la tabla de usuario no funcionó. Tampoco FLUSH PRIVILEGES. Tienes que eliminar de las otras tablas anteriores.
alds
4

Curiosamente, el banco de trabajo MySQL lo resolvió por mí. En la pestaña Administración -> Usuarios y privilegios, el usuario aparece en la lista con un error. El uso de la opción eliminar resolvió el problema.

juettemann
fuente
3

Una solución simple sobre este tema. Como el comando "eliminar" solo elimina el registro de usuario en la tabla "usuario" de la base de datos "mysql", podríamos volver a agregarlo y luego eliminar al usuario por completo. Entonces podría crear un usuario con el mismo nombre.

Paso 1. encuentre el formato de registro de la tabla de usuario en la base de datos mysql

use mysql;
select * from user;

Paso 2. De acuerdo con las columnas mostradas en el paso 1, cree un registro ficticio con el nombre de usuario. Insértelo en la tabla, por ejemplo, recuerde reemplazar el "nombre de usuario" con su nombre de usuario.

Insert into user value ('%','username','N','N','N','N','N',
'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',
'N','N','N','N','N','N','N','N','N','','','','','0','0','0',
'0','mysql_native_password',
'*52C5E3AC6BC5E2E0BFF86978BF62A1481AC79D58','N',
'2016-12-10 23:59:12',null,'N');

Nota: a veces puede encontrar problemas al insertar, solo cambie los datos para que funcionen.

Paso 3. Descarta al usuario.

drop user username;

Ahora puede crear usuarios con el mismo nombre.

Jason Mao
fuente
Prueba DESCRIBE <tablename>
Prisionero 13 de
2

Esta publicación MySQL ERROR 1045 (28000): El acceso denegado para el usuario 'bill' @ 'localhost' (usando la contraseña: YES) es útil. A veces, hay un usuario anónimo '' @ 'localhost' o '' @ '127.0.0.1'. Entonces, para resolver el problema,

  1. primero descarte al usuario cuyo 'crear usuario' falló

  2. Crear nuevo usuario.

  3. Otorgue los privilegios necesarios al nuevo usuario.

  4. Privilegios de descarga.

usuario_19
fuente
Gracias por esto. Olvidé ejecutar mysql_secure_installation que eliminó al usuario anónimo.
ablackhat
2

Yo tenía el mismo error. Pero ordene "PRIVILEGIOS DE LAVADO"; no ayudó Me gustó eso:

CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
UPDATE mysql.user SET USER='jack' WHERE USER='jimmy';
Camada
fuente
0

El servidor MySQL se ejecuta con la opción --skip-grant-tables, por lo que no puede ejecutar esta declaración

irfan habib
fuente
0

Sé que esto es viejo, pero como es el primer resultado en Google, pensé que debería agregar mi solución. En mi caso, dejar caer al usuario funcionó bien, pero recrearlo me dio un "ERROR 2013 (HY000): pérdida de conexión al servidor MySQL durante la consulta" y "ERROR 2006 (HY000): el servidor MySQL se ha ido". Probé los privilegios de descarga -> soltar la solución de usuario, pero aún tuve el mismo error.

En mi caso, el error se debió a una actualización de mysql de 5.1 -> 5.6. Al ver los registros de errores, noté que decía ejecutar mysql_upgrade. ¡Lo hice y mi declaración de usuario funcionó bien!

vik
fuente
0

Recientemente recibí este error.

Lo que funcionó para mí es verificar en mysql workbench 'Usuarios y privilegios' y darse cuenta de que el usuario todavía existía.

Después de eliminarlo desde allí, pude recrear al usuario.

dmena
fuente
0

mysql> DELETE FROM mysql.db WHERE user = 'jack'

Reinicia el servidor:

# mysql.server restart

Entonces haz tu CREATE USERcomando.

emallove
fuente
Esto no es útil. El error se encontró en CREATEdespués DELETE.
waqasgard
0

Hoy me enfrenté a este problema y lo resolví siguiendo los siguientes pasos:

1) insertar manualmente ese usuario problemático proporcionando valor de campos obligatorios en mysql.user

mysql> insert into user(Host, User, Password, ssl_type) 
   values ('localhost', 'jack', 'jack', 'ANY');

2)

mysql> select * from user where User = 'jack';
   1 row in set (0.00 sec)

3) A.

mysql> drop user jack;
Query OK, 0 rows affected (0.00 sec)

B. mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

C. mysql> create user 'jack' identified by 'jack';
Query OK, 0 rows affected (0.00 sec)

D. mysql> select Host, User, Password, ssl_type  from user where User = 'jack';
+-----------+-----------+-------------------------------------------+----------+
| Host      | User      | Password                                  | ssl_type |
+-----------+-----------+-------------------------------------------+----------+
| localhost | jack      | jack                                      | ANY      |
| %         | jack      | *45BB7035F11303D8F09B2877A00D2510DCE4D758 |          |
+-----------+-----------+-------------------------------------------+----------+
2 rows in set (0.00 sec)

4) A.

mysql> delete from user 
 where User = 'nyse_user' and 
       Host = 'localhost' and 
       Password ='nyse';
Query OK, 1 row affected (0.00 sec)

SI.

mysql> select Host, User, Password, ssl_type  from user where User = 'jack';
+------+-----------+-------------------------------------------+----------+
| Host | User      | Password                                  | ssl_type |
+------+-----------+-------------------------------------------+----------+
| %    | jack      | *45BB7035F11303D8F09B2877A00D2510DCE4D758 |          |
+------+-----------+-------------------------------------------+----------+
1 row in set (0.00 sec)

Espero que esto ayude.

monika mendiratta
fuente
-2

Simplemente elimine los datos relacionados con el usuario de mysql.db (quizás también de otras tablas), luego vuelva a crear ambos.

Richard Abonyi
fuente
-2

También me enfrenté al mismo problema, después de algunas búsquedas, encontré una solución que funcionó para mí. Espero que te ayude. Como ya ha creado usuarios, ahora intente hacer uno FLUSH PRIVILEGESen su consola Mysql. Este problema ya está en la publicación de errores de MySql. También puede verificar esto. Ahora, después de enjuagar, puede crear un nuevo usuario. siga los pasos a continuación:

Step-1: Open terminal Ctrl+Alt+T
Step-2: mysql -u root -p  , it will ask for your MySQL password.

Ahora puedes ver la consola Mysql.

Step-3: CREATE USER 'username'@'host' IDENTIFIED by 'PASSWORD';

En lugar de nombre de usuario, puede poner el nombre de usuario que desee. Si está ejecutando Mysql en su máquina local, escriba "localhost" lugar del host, de lo contrario, indique el nombre del servidor al que desea acceder.

Ej: CREAR USUARIO smruti @ localhost IDENTIFICADO por 'hola';

Ahora se crea un nuevo usuario. Si desea dar acceso a todos, escriba

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

Ahora puede salir de MySQL escribiendo \q. Ahora, una vez más, inicie sesión a través de

mysql -u newusername -p, luego presione Entrar. Puedes ver todo.

Espero que esto ayude.

PyDevSRS
fuente