ERRORE 1396 (HY000): Operazione CREATE USER non riuscita per 'jack' @ 'localhost'


311

Mi sembra di non riuscire a ricreare un utente semplice che ho eliminato, anche come root in MySQL.

Il mio caso: l'utente "jack" esisteva prima, ma l'ho eliminato da mysql.user per ricrearlo. Non vedo tracce di questo in quella tabella. Se eseguo questo comando per qualche altro nome utente casuale, dico "jimmy", funziona benissimo (proprio come in origine per "jack").

Che cosa ho fatto per corrompere l'utente "jack" e come posso annullare quella corruzione al fine di ricreare "jack" come utente valido per questa installazione di MySQL?

Vedi esempio sotto. (Naturalmente, in origine, c'era molto tempo tra la creazione di "jack" e la sua rimozione.)

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)

Risposte:


233

Prova a fare un FLUSH PRIVILEGES;. Questo post di bug di MySQL su quel codice di errore sembra riportare un certo successo in un caso simile al tuo dopo aver scaricato i priv. 


13
Avevo trovato questo suggerimento e l'avevo provato prima senza successo, ma forse c'era qualcos'altro che non andava. Provandolo ancora una volta, quindi ricreando la situazione con un altro utente, ho scoperto che in effetti ha funzionato. Ovviamente, la risposta formale di oggi è stata "non essere stupidi" e usare REVOKE e DROP USER per farlo bene. Sono in debito con tutte e tre le risposte (questa è proprio quella che mi ha salvato dalla mia situazione attuale).
Russ Bateman,

13
È il 2016, mysql è in v14.14 ed è ancora rotto.
ivo Welch,

4
Per prima cosa ho dovuto eliminare l'utente secondo la risposta @ tver3305.
Shautieh,

9
Sto riscontrando lo stesso problema con 10.1.21, ma i "privilegi flush" non hanno fatto alcuna differenza. Rilascio l'utente, svuoto e quindi creo, che non riesce con "ERRORE 1396 (HY000) alla riga 7: Operazione CREATE USER non riuscita per ...". Vorrei poter ottenere mysql / mariadb per elaborare un po 'l'errore, come PERCHÉ non è riuscito.
David M. Karr,

3
Ho ricevuto l'errore anche quando provo a eliminare anche l'utente, i "privilegi di scaricamento" non hanno funzionato per me, dopo aver fatto un po 'di ricerca, ho trovato la soluzione revocando tutti gli accessi e rilasciando l'utente, non credo , l'operazione di flush aiuterà in casi simili, ho condiviso la mia spiegazione dettagliata in questa pagina rathishkumar.in/2018/10/…
Rathish

545

sì, questo bug è lì. Tuttavia, ho trovato una piccola soluzione.

  • Supponiamo che l'utente sia lì, quindi rilascia l'utente
  • Dopo aver eliminato l'utente, è necessario scaricare i privilegi di mysql
  • Ora crea l'utente.

Questo dovrebbe risolverlo. Supponendo di voler creare l'utente admin @ localhost, questi sarebbero i comandi:

drop user admin @ localhost;
privilegi di scarico;
crea user admin @ localhost identificato da ' admins_password '

Saluti


58
I privilegi di lavaggio da soli non hanno funzionato per me. far cadere l'utente ha risolto tutto. Grazie.
Jake,

3
Stessa cosa per me. Prima ho dovuto abbandonare l'utente.
kgiannakakis,

3
La soluzione @QuantumMechanic non ha funzionato per me, ma drop e flush hanno funzionato.
Piani cottura

Nel mio caso, abbandonare l'utente era enogh, senza svuotare i privilegi.
Scadge il

Questo è stato un enorme salvavita - come con @Jake sopra la parte chiave era l'utente drop con la parte localhost
kellyfj

46

Questo bug è stato pubblicato su bugs.mysql.com dal 2007 e questo thread è principalmente solo un pappagallo di tutte quelle risposte sbagliate fino a un anno fa.

Secondo la documentazione di MySQL, comandi come CREATE USER, GRANT, REVOKE, e DROP USERnon richiedono un successivo FLUSH PRIVILEGEScomando. È abbastanza chiaro perché, se si leggono i documenti. È perché la modifica diretta delle tabelle MySQL non ricarica le informazioni in memoria; tuttavia la pletora di soluzioni a questo bug afferma che questa FLUSH PRIVILEGESè la risposta.

Anche questo potrebbe non essere nemmeno un bug. È una cospirazione della documentazione: i documenti variano in un punto critico da una versione all'altra.

13.7.1.2. Sintassi UTENTE DROP

...

Utente DROP USER [, utente] ...

...

UTENTE DROP 'jeffrey' @ 'localhost';

Se si specifica solo la parte del nome utente del nome dell'account, viene utilizzata una parte del nome host di '%'.

DROP USERcome presente in MySQL 5.0.0 rimuove solo gli account che non dispongono di privilegi. In MySQL 5.0.2, è stato modificato per rimuovere anche i privilegi dell'account. Ciò significa che la procedura per la rimozione di un account dipende dalla tua versione di MySQL.

A partire da MySQL 5.0.2, puoi rimuovere un account e i suoi privilegi come segue:

Utente DROP USER;

L'istruzione rimuove le righe dei privilegi per l'account da tutte le tabelle di concessione.

L'unica volta che ottengo questo errore è quando lo faccio DROP USER user; come suggerisce il documento, ma MySQL non considera il '%' come un carattere jolly in un modo che eliminerebbe tutti gli utenti di tutti gli host. Dopotutto non è così selvaggio. Oppure, a volte può funzionare quando elimina l'utente localhost e quindi tenta di eliminare quello su%.

È chiaro per me che quando tenta di eliminare l'utente in%, emette un messaggio di errore e si chiude. Il successivo CREATE USERsu localhost fallirà perché l'utente localhost non è mai stato cancellato. Sembra che non ci sia bisogno di perdere tempo a scavare nelle tabelle delle sovvenzioni alla ricerca di fantasmi come suggerito da un poster.

Vedo 7 voti per:

DROP USER 'jack @ localhost'; // elimina completamente l'account

Che è interpretato come DROP USER 'jack@localhost'@'%';# sbagliato

In realtà sembra esserci un vero bug che genera lo stesso messaggio di errore, ma ha a che fare con l'eliminazione del primo utente creato (dopo l'installazione di un nuovo server mysql). Se quel bug è stato corretto, non lo so; ma non ricordo che stia succedendo di recente e al momento vado alla versione 5.5.27.


8
Sei uno scrittore di documenti MySQL?
Pacerier,

Questa è stata la risposta per me. Mariadb ha ereditato questo errore.
zerpsato l'

Perché questa non è la risposta accettata: /. Comunque, grazie @ user1969061. Questo ha sicuramente funzionato per me inmariadb-server-5.5.60-1.el7_5.x86_64
han solo

36

Se si utilizza DELETEun'istruzione sulla mysql.usertabella nel tentativo di rimuovere un utente, quindi si tenta di ristabilire l'utente con CREATE USER, si otterrà un 1396errore. Sbarazzati di questo errore eseguendoDROP USER 'username'@'host';

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

(Riceverai 1396 errori se provi a ricreare il jack)

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

(Esci da questa situazione correndo DROP USER)

DROP USER 'jack'@'localhost';

(Suppongo che FLUSH PRIVILEGESnon possa far male, ma definitivamente abbandonare prima l'utente.)


24

Non dovresti eliminare manualmente gli utenti in questo modo. MySQL ha una REVOKEsintassi per rimuovere i privilegi e DROP USERper eliminarli:

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

Meglio usare gli strumenti forniti piuttosto che confondersi in background.


2
Questa era la vera risposta, ma non al problema che stavo avendo (che è stato creato dalla mia stupidità). Grazie mille per avermi chiarito!
Russ Bateman,

@Marc, allora , perché hanno inventato persino flush privilegesin primo luogo? La documentazione ufficiale di MySQL fanno parlare di cose del genere delete from user where user = 'jack'; e flush privileges. Perché dici che non fanno parte degli strumenti forniti?
Pacerier,

1
Come sottolinea @ user1969061, 'jack@localhost'probabilmente dovrebbe essere 'jack'@'localhost'qui.
jochen

11

Rilascia l'utente, scarica i privilegi; quindi, creare l'utente. Funziona!


1
I privilegi di scaricamento da soli non hanno funzionato fino a quando non ho lasciato cadere l'utente. Grazie.
Brandon Fitzpatrick l'

10

prova delete from mysql.db where user = 'jack'e quindi crea un utente


1
Questo è stato utile per aiutarmi a capire come avevo corrotto la mia installazione. Grazie mille.
Russ Bateman,

Leggi più in basso fino al commento di Fely. Ci sono più tavoli coinvolti.
Prigioniero 13

6

In MySQL 5.6 l'utilizzo Drop user userid;non funziona. Usa: Drop user 'userid'@'localhost';e / o Drop user 'userid'@'%';. In questo modo sono stato in grado di eliminare l'utente e ricrearlo.


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';


4

Se si desidera eliminare un utente con SQL, è necessario eliminare i dati relativi a queste tabelle: columns_priv, db, procs_priv, tables_priv. Quindi eseguireflush privileges;


Bella risposta!! La tua risposta espone il problema "dietro le quinte" su ciò che sta realmente accadendo piuttosto che semplicemente "Usa questa patch e sei a posto". Mi piacciono entrambi i tipi di risposte incluse tutte insieme in modo da poterlo capire dalla zuppa alle noci. Ora so quanto lavoro serve per farlo in questo modo se lo farai nel modo giusto - e questo rafforza ulteriormente il motivo per cui uno dovrebbe usare i metodi delineati da altri. Eccezionale! Anche se molte risposte sopra erano buone, ti sto dando il mio voto perché so cosa vuol dire essere un nuovo arrivato su questo sito. Rendono davvero difficile aiutare gli altri quando sei nuovo.
Prigioniero 13

Questa dovrebbe essere una risposta alternativa accettata. Sto usando mysql 5.5 e DROP USER SE EXISTS non è ancora disponibile, quindi devo usare la sintassi utente DELETE FROM (devo prima verificare l'esistenza dell'utente). L'eliminazione dalla tabella utente da sola non ha funzionato. Nemmeno FLUSH PRIVILEGES. Devi eliminare dalle altre tabelle sopra.
alds

4

Stranamente il banco di lavoro di MySQL lo ha risolto per me. Nella scheda Amministrazione -> Utenti e privilegi, l'utente è stato elencato con un errore. L'uso dell'opzione di eliminazione ha risolto il problema.


3

Una semplice soluzione a questo problema. Poiché il comando "elimina" rimuove solo il record utente nella tabella "utente" del database "mysql", è possibile aggiungerlo nuovamente e quindi eliminare completamente l'utente. Quindi è possibile creare un utente con lo stesso nome.

Passaggio 1. trovare il formato record della tabella utente nel database mysql

use mysql;
select * from user;

Passaggio 2. In base alle colonne mostrate nel passaggio 1, creare un record fittizio con il nome utente. Inseriscilo nella tabella, ad esempio, ricordati di sostituire il "nome utente" con il tuo nome utente.

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 volte potresti riscontrare problemi durante l'inserimento, basta cambiare i dati per farlo funzionare.

Passaggio 3. Rilasciare l'utente.

drop user username;

Ora puoi creare un utente con lo stesso nome.


Prova DESCRIBE <tablename>
Prisoner 13

2

Questo post MySQL ERROR 1045 (28000): Accesso negato per l'utente 'bill' @ 'localhost' (usando la password: YES) è utile. A volte, c'è un utente anonimo '' @ 'localhost' o '' @ '127.0.0.1'. Quindi, per risolvere il problema,

  1. prima rilasciare l'utente il cui "crea utente" non è riuscito.

  2. Crea un nuovo utente.

  3. Concedere i privilegi richiesti al nuovo utente.

  4. Privilegi a filo.


Grazie per questo. Ho dimenticato di eseguire mysql_secure_installation che ha eliminato l'utente anonimo.
ablackhat

2

Ho avuto lo stesso errore. Ma comando "FLUSH PRIVILEGES;" non ha aiutato. Mi è piaciuto quello:

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

0

Il server MySQL è in esecuzione con l'opzione --skip-grant-tables quindi non può eseguire questa istruzione


0

So che è vecchio, ma dato che è il primo risultato in Google ho pensato che avrei dovuto aggiungere la mia soluzione. Nel mio caso la caduta dell'utente ha funzionato bene, ma ricrearlo mi ha dato un "ERRORE 2013 (HY000): perdita di connessione al server MySQL durante la query" e "ERRORE 2006 (HY000): il server MySQL è andato via". Ho provato i privilegi di flush -> drop user solution, ma ho ancora avuto lo stesso errore.

Nel mio caso l'errore era dovuto a un aggiornamento mysql da 5.1 -> 5.6. Visualizzando i log degli errori, ho notato che diceva di eseguire mysql_upgrade. Ha funzionato bene e il mio estratto conto utente ha funzionato bene!


0

Recentemente ho ricevuto questo errore.

Ciò che ha funzionato per me è controllare nel workbench mysql "Utenti e privilegi" e capire che l'utente esiste ancora.

Dopo averlo eliminato da lì, sono stato in grado di ricreare l'utente.


0

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

Riavvia il server:

# mysql.server restart

Quindi esegui il tuo CREATE USERcomando.


Questo non è utile L'errore si è verificato CREATEdopo DELETE.
Waqasgard,

0

Ho affrontato questo problema oggi e l'ho risolto procedendo come segue:

1) inserendo manualmente quell'utente problematico fornendo il valore dei campi obbligatori in 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)

B.

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)

Spero che questo ti aiuti.


-2

Basta eliminare i dati relativi all'utente da mysql.db (forse anche da altre tabelle), quindi ricrearli entrambi.


-2

Avevo anche affrontato lo stesso problema, dopo alcune ricerche, ho trovato una soluzione che ha funzionato per me. Spero che ti possa aiutare. Dato che hai già creato utenti, ora prova a fare un FLUSH PRIVILEGESsulla tua console Mysql. Questo problema è già presente nel bug post di MySql. Puoi anche controllare questo. Ora dopo aver scaricato, puoi creare un nuovo utente. seguire i passaggi seguenti:

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

Ora puoi vedere la console di Mysql.

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

Invece del nome utente puoi inserire il nome utente desiderato. Se stai eseguendo Mysql sul tuo computer locale, digita "localhost" anziché l'host, altrimenti dai il nome del tuo server a cui vuoi accedere.

Es: CREATE USER smruti @ localhost IDENTIFICATO da 'hello';

Ora viene creato un nuovo utente. Se si desidera dare tutto l'accesso, digitare

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

Ora puoi uscire da MySQL digitando \q. Ora accedi nuovamente

mysql -u newusername -p, quindi premere Invio. Puoi vedere tutto.

Spero che questo ti aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.