ERRO 1396 (HY000): Falha na operação CREATE USER para 'jack' @ 'localhost'

311

Parece-me incapaz de recriar um usuário simples que excluí, mesmo como root no MySQL.

Meu caso: o usuário 'jack' existia antes, mas eu o apaguei do mysql.user para recriá-lo. Não vejo vestígios disso nessa tabela. Se eu executar este comando para outro nome de usuário aleatório, digamos 'jimmy', ele funcionará bem (exatamente como originalmente para 'jack').

O que eu fiz para corromper o usuário 'jack' e como posso desfazer essa corrupção para recriar 'jack' como um usuário válido para esta instalação do MySQL?

Veja o exemplo abaixo. (Obviamente, originalmente, havia muito tempo entre a criação de 'jack' e sua remoção.)

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
fonte

Respostas:

233

Tente fazer um FLUSH PRIVILEGES;. Esta publicação de bug do MySQL nesse código de erro parece relatar algum sucesso em um caso semelhante ao seu após a liberação de privs. 

QuantumMechanic
fonte
13
Eu encontrei essa sugestão e a tentei antes sem sucesso, mas talvez algo mais estivesse errado. Tentando agora de novo e depois recriando a situação com outro usuário, descobri que isso realmente funcionou. Obviamente, a resposta formal hoje foi "para não ser estúpido" e usar REVOKE e DROP USER para fazer o certo. Sou grato pelas três respostas (essa aqui é a que me salvou da minha situação atual).
Russ Bateman
13
É 2016, o mysql está na v14.14 e ainda está quebrado.
Ivo Welch
4
Primeiro eu precisava soltar o usuário de acordo com a resposta @ tver3305.
Shautieh 28/10
9
Estou vendo o mesmo problema com a versão 10.1.21, mas "privilégios de liberação" não fez nenhuma diferença. Largo o usuário, libero e, em seguida, crio, que falha com "ERRO 1396 (HY000) na linha 7: Operação CREATE USER falhou para ...". Eu gostaria de conseguir que o mysql / mariadb elabore um pouco esse erro, como POR QUE ele falhou.
David M. Karr
3
Eu recebi o erro mesmo quando tento soltar o usuário também, 'liberar privilégios' não funcionou para mim. Depois de pesquisar um pouco, encontrei a solução revogando todo o acesso e soltando o usuário, acho que não , a operação de descarga ajudará em casos semelhantes. Compartilhei minha explicação detalhada nesta página rathishkumar.in/2018/10/…
Rathish
545

Sim, este bug está lá. No entanto, encontrei uma pequena solução alternativa.

  • Suponha que o usuário esteja lá, então largue o usuário
  • Após excluir o usuário, é necessário liberar os privilégios do mysql
  • Agora crie o usuário.

Isso deve resolver isso. Supondo que desejamos criar o usuário admin @ localhost, estes seriam os comandos:

solte o usuário admin @ localhost;
privilégios de liberação;
crie usuário admin @ localhost identificado por ' admins_password '

Felicidades

tver3305
fonte
58
Somente os privilégios de liberação não funcionaram para mim. deixar o usuário consertar tudo. Obrigado.
27412 Jake
3
O mesmo para mim. Eu tive que largar o usuário primeiro.
Kgiannakakis
3
A solução @QuantumMechanic não funcionou para mim, mas a queda e a descarga funcionaram.
hobs
No meu caso, apenas largar o usuário era suficiente, sem privilégios de liberação.
Scadge
Este foi um salva-vidas enorme - como com @Jake acima da parte fundamental foi o drop user com a parte localhost
kellyfj
46

Esse bug está no bugs.mysql.com desde 2007 e esse tópico é basicamente apenas um papagaio de todas as respostas erradas até um ano atrás.

De acordo com a documentação do MySQL, comandos como CREATE USER, GRANT, REVOKE, e DROP USERnão requerem uma posterior FLUSH PRIVILEGEScomando. É bem claro por que, se alguém lê os documentos. É porque alterar diretamente as tabelas do MySQL não recarrega as informações na memória; no entanto, a infinidade de soluções para esse bug afirma que FLUSH PRIVILEGESé a resposta.

Isso também pode nem ser um bug. É uma conspiração de documentação - os documentos variam em um local crítico de versão para versão.

13.7.1.2 Sintaxe DROP USER

...

Usuário DROP USER [, usuário] ...

...

DROP USER 'jeffrey' @ 'localhost';

Se você especificar apenas a parte do nome de usuário do nome da conta, será usada uma parte do nome do host de '%'.

DROP USERcomo presente no MySQL 5.0.0 remove somente contas que não têm privilégios. No MySQL 5.0.2, ele foi modificado para remover os privilégios da conta também. Isso significa que o procedimento para remover uma conta depende da sua versão do MySQL.

No MySQL 5.0.2, você pode remover uma conta e seus privilégios da seguinte maneira:

Usuário DROP USER;

A instrução remove as linhas de privilégio da conta de todas as tabelas de concessão.

A única vez que recebo esse erro é quando o faço DROP USER user; como o documento sugere, mas o MySQL não trata o '%' como um curinga de maneira a eliminar todos os usuários em todos os hosts. Afinal, não é tão selvagem. Ou, às vezes, funciona quando exclui o usuário do host local e tenta excluir o usuário em%.

É claro para mim que, quando tenta excluir o usuário em%, emite uma mensagem de erro e sai. Subseqüente CREATE USERem localhost falhará porque o usuário localhost nunca foi excluído. Parece não haver necessidade de perder tempo cavando nas tabelas de subsídios à procura de fantasmas, como sugeriu um pôster.

Vejo 7 votos a favor:

DROP USER 'jack @ localhost'; // exclui completamente a conta

Que é interpretado como DROP USER 'jack@localhost'@'%';# errado

Na verdade, parece haver um bug real que gera a mesma mensagem de erro, mas tem a ver com o primeiro usuário criado (após a instalação de um novo servidor mysql) ser descartado. Se esse bug foi corrigido, não sei; mas não me lembro disso acontecendo ultimamente e estou com a versão 5.5.27 no momento.

user1969061
fonte
8
Você é um escritor de documentos MySQL?
Pacerier 14/01
Essa foi a resposta para mim. Mariadb herdou esse bug.
Zerpsed
Por que essa não é a resposta aceita: /. De qualquer forma, obrigado @ user1969061. Isso certamente funcionou para mim emmariadb-server-5.5.60-1.el7_5.x86_64
han solo
36

Se você usar uma DELETEinstrução na mysql.usertabela na tentativa de remover um usuário e tentar restabelecer o usuário CREATE USER, receberá um 1396erro. Livre-se desse erro executandoDROP USER 'username'@'host';

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

(Você receberá 1396 erros se tentar recriar o conector)

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

(Saia dessa situação executando DROP USER)

DROP USER 'jack'@'localhost';

(Suponho FLUSH PRIVILEGESque não pode machucar, mas definitivamente derrube o usuário primeiro.)

Anthony Rutledge
fonte
24

Você não deve excluir manualmente os usuários dessa maneira. O MySQL possui REVOKEsintaxe para remover privilégios e DROP USERexcluí-los:

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

É melhor usar as ferramentas fornecidas, em vez de mexer no fundo.

Marc B
fonte
2
Esta foi a resposta real, mas não para o problema que eu estava tendo (criado pela minha estupidez). Muito obrigado por me esclarecer!
Russ Bateman
@ Marc, então , por que eles inventaram flush privilegesem primeiro lugar? Os documentos oficiais MySQL fazer conversa sobre coisas como delete from user where user = 'jack'; e flush privileges. Por que você diz que eles não fazem parte das ferramentas fornecidas?
Pacerier 14/01
1
Como @ user1969061 aponta, 'jack@localhost'provavelmente deveria estar 'jack'@'localhost'aqui.
jochen
11

Largue o usuário, liberte os privilégios; então, crie o usuário. Isso funciona!

罗俊峰
fonte
1
A liberação de privilégios por si só não funcionou até eu deixar o usuário cair. Obrigado.
Brandon Fitzpatrick
10

tente delete from mysql.db where user = 'jack'e crie um usuário

a1ex07
fonte
1
Isso foi útil para me ajudar a entender como eu havia corrompido minha instalação. Muito obrigado.
Russ Bateman
Leia mais abaixo no comentário de Fely. Existem mais tabelas envolvidas.
Prisoner 13
6

No MySQL 5.6, o uso Drop user userid;não funciona. Use: Drop user 'userid'@'localhost';e / ou Drop user 'userid'@'%';. Dessa maneira, pude descartar o usuário e recriá-lo.

Joilson Cardoso
fonte
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
fonte
5

Verifique se está

'do utilizador'@'%'

ou

'usuário' @ 'localhost'

Inês Gomes
fonte
4

Se você deseja excluir um usuário com sql, você precisa apagar os dados relacionados nestas tabelas: columns_priv, db, procs_priv, tables_priv. Então executeflush privileges;

fely
fonte
Boa resposta!! Sua resposta expõe a questão dos bastidores do que realmente está acontecendo, em vez de apenas "Use este patch e você está pronto para ir". Gosto dos dois tipos de respostas, todos juntos, para que eu possa entender desde a sopa até as nozes. Agora eu sei quanto trabalho é fazer dessa maneira, se você estiver fazendo o certo - e isso reforça ainda mais o porquê de alguém usar os métodos descritos por outros. Impressionante! Embora muitas respostas acima tenham sido boas, estou lhe dando meu voto porque sei como é ser um novato neste site. Eles tornam muito difícil ajudar os outros quando você é novo.
Prisoner 13
Esta deve ser uma resposta aceita alternativa. Estou usando o mysql 5.5 e o DROP USER IF EXISTS ainda não está disponível, portanto, tenho que usar a sintaxe DELETE FROM do usuário (preciso testar a existência do usuário primeiro). A exclusão da tabela de usuários sozinha não funcionou. Nem os privilégios de descarga. Você precisa excluir das outras tabelas acima.
AIDS
4

Curiosamente, o ambiente de trabalho MySQL resolveu isso para mim. Na guia Administração -> Usuários e Privilégios, o usuário foi listado com um erro. O uso da opção de exclusão resolveu o problema.

juettemann
fonte
3

Uma solução simples para esse problema. Como o comando "delete" remove apenas o registro do usuário na tabela "user" do banco de dados "mysql", poderíamos adicioná-lo novamente e, em seguida, excluir o usuário completamente. Então você pode criar um usuário com o mesmo nome.

Etapa 1. encontre o formato de registro da tabela de usuários no banco de dados mysql

use mysql;
select * from user;

Etapa 2. De acordo com as colunas mostradas na etapa 1, crie um registro fictício com o nome do usuário. Insira-o na tabela, por exemplo, lembre-se de substituir o "nome de usuário" pelo seu nome de usuário.

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: às vezes você pode encontrar problemas ao inserir, basta alterar os dados para fazê-lo funcionar.

Etapa 3. Solte o usuário.

drop user username;

Agora você pode criar usuários com o mesmo nome.

Jason Mao
fonte
Tente DESCRIBE <tablename>
Prisioneiro 13 /
2

Este post MySQL ERROR 1045 (28000): Acesso negado para o usuário 'conta' @ 'localhost' (using password: YES) é útil. Às vezes, há um usuário anônimo '' @ 'localhost' ou '' @ '127.0.0.1'. Então, para resolver o problema,

  1. primeiro solte o usuário cujo 'criar usuário' falhou.

  2. Crie um novo usuário.

  3. Conceda os privilégios necessários para o novo usuário.

  4. Privilégios de liberação.

user_19
fonte
Obrigado por isso. Esqueci de executar o mysql_secure_installation que excluiu o usuário anônimo.
precisa saber é o seguinte
2

Eu tive o mesmo erro. Mas comande "DESCARREGAR PRIVILÉGIOS"; não ajudou. Eu fiz assim:

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

O servidor MySQL está sendo executado com a opção --skip-grant-tables, portanto, não pode executar esta instrução

irfan habib
fonte
0

Sei que isso é antigo, mas, como é o primeiro resultado no Google, achei que deveria adicionar minha solução. No meu caso, a remoção do usuário funcionou bem, mas a recriação do usuário me deu um "ERRO 2013 (HY000): conexão perdida com o servidor MySQL durante a consulta" e "ERRO 2006 (HY000): o servidor MySQL desapareceu". Eu tentei os privilégios de liberação -> solte a solução do usuário, mas ainda tive o mesmo erro.

No meu caso, o erro ocorreu devido a uma atualização do mysql de 5.1 -> 5.6. Vendo os logs de erro, notei que ele dizia executar mysql_upgrade. Fiz isso e minha declaração de usuário de criação funcionou bem!

vik
fonte
0

Recentemente, recebi esse erro.

O que funcionou para mim foi checar no 'mysql workbench' Users and Privileges 'e perceber que o usuário ainda existia.

Depois de excluí-lo, pude recriar o usuário.

dmena
fonte
0

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

Reinicie o servidor:

# mysql.server restart

Então faça seu CREATE USERcomando.

emallove
fonte
Isso não é útil. O erro foi encontrado em CREATEdepois DELETE.
waqasgard
0

Eu enfrentei esse problema hoje e o resolvi executando as seguintes etapas:

1) inserir manualmente esse usuário problemático, fornecendo valor dos campos obrigatórios 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)

Espero que isto ajude.

monika mendiratta
fonte
-2

Apenas exclua os dados relacionados ao usuário do mysql.db (talvez também de outras tabelas) e depois recrie os dois.

Richard Abonyi
fonte
-2

Também enfrentei o mesmo problema, depois de algumas pesquisas, encontrei uma solução que funcionou para mim. Espero que ajude você. Como você já criou usuários, agora tente fazer um FLUSH PRIVILEGESno seu console Mysql. Este problema já está na publicação de erros do MySQL. Você também pode verificar este. Agora, após a liberação, você pode criar um novo usuário. siga as etapas abaixo:

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

Agora você pode ver o console do Mysql.

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

Em vez do nome de usuário, você pode colocar o nome de usuário desejado. Se você estiver executando o Mysql em sua máquina local, digite "localhost" em vez do host; caso contrário, forneça o nome do servidor que você deseja acessar.

Ex: CRIAR USUÁRIO smruti @ localhost IDENTIFICADO por 'hello';

Agora novo usuário é criado. Se você deseja dar todo o acesso, digite

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

Agora você pode sair do MySQL digitando \q.Agora, faça o login novamente

mysql -u newusername -pe pressione Enter. Você pode ver tudo.

Espero que isto ajude.

PyDevSRS
fonte