MySQL ERROR 1045 (28000): Acesso negado para o usuário 'bill' @ 'localhost' (usando a senha: YES)

430

Primeiro, deixe-me mencionar que passei por muitas perguntas sugeridas e não encontrei resposta relevante. Aqui está o que estou fazendo.

Estou conectado à minha instância do Amazon EC2. Eu posso entrar com a raiz do MySQL com este comando:

mysql -u root -p

Em seguida, criei uma nova conta de usuário com o host%

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

Concedidos todos os privilégios para a conta do usuário:

grant all privileges on *.* to 'bill'@'%' with grant option;

Então eu saio do usuário root e tento fazer o login com bill:

mysql -u bill -p

digitou a senha correta e obteve este erro:

ERRO 1045 (28000): acesso negado para o usuário 'bill' @ 'localhost' (usando a senha: YES)

Todos
fonte
34
Você fez FLUSH PRIVILEGES?
eggyal
6
Ok, eu tentei isso sem sucesso. Qualquer outra sugestão, por favor.
Ali
1
Qual versão do servidor você está executando? Eu já vi o 5.1 se comportar de maneira estranha sobre isso.
Poodlehat
2
Isso aconteceu comigo ao instalar o Magento e cometi um erro muito mais tolo. Colocar 'mysql -u magento -p magento' estava me solicitar uma senha e, em vez da senha padrão eu estava colocando a senha de root no.
AmirHd
2
@authentictech, infelizmente, nenhuma das soluções sugeridas funcionou para mim no momento em que esta pergunta foi publicada. Por favor, veja minha própria resposta que me ajudou a sair dessa situação. Por esse motivo, não marquei nenhuma delas como resposta. Provavelmente, posso marcar a resposta mais alta como resposta.
Ali

Respostas:

442

Você provavelmente tem um usuário anônimo ''@'localhost'ou ''@'127.0.0.1'.

Conforme o manual :

Quando várias correspondências são possíveis, o servidor deve determinar qual delas usar. Resolve esse problema da seguinte forma: (...)

  • Quando um cliente tenta se conectar, o servidor examina as linhas [da tabela mysql.user] na ordem classificada.
  • O servidor usa a primeira linha que corresponde ao nome do host e ao nome do usuário do cliente.

(...) O servidor usa regras de classificação que ordenam linhas com os valores de host mais específicos primeiro . Nomes de host literais [como 'localhost'] e endereços IP são os mais específicos.

Portanto, esse usuário anônimo "mascararia" qualquer outro usuário '[any_username]'@'%'ao se conectar localhost.

'bill'@'localhost'corresponde 'bill'@'%', mas corresponderia (por exemplo) de ''@'localhost'antemão.

A solução recomendada é descartar esse usuário anônimo (isso geralmente é uma boa coisa a se fazer).


As edições abaixo são principalmente irrelevantes para a questão principal. Estes destinam-se apenas a responder a algumas questões levantadas em outros comentários neste tópico.

Editar 1

Autenticando como 'bill'@'%'através de um soquete.

    Você pode usar o seguinte comando: root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    Bem-vindo ao monitor MySQL (...)

    mysql> SELECT usuário, host FROM mysql.user;
    + ------ + ----------- +
    | usuário | host |
    + ------ + ----------- +
    | fatura | % |
    | raiz | 127.0.0.1
    | raiz | :: 1 |
    | raiz | localhost |
    + ------ + ----------- +
    4 linhas em conjunto (0,00 s)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USUÁRIO () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | fatura @% |
    + ---------------- + ---------------- +
    1 linha no conjunto (0,02 s)

    mysql> MOSTRA VARIÁVEIS COMO 'skip_networking';
    + ----------------- + ------- +
    | Nome da variável | Valor
    + ----------------- + ------- +
    | skip_networking | ON |
    + ----------------- + ------- +
    1 linha no conjunto (0,00 s)

Editar 2

Exatamente a mesma configuração, exceto que eu reativei a rede e agora crio um usuário anônimo ''@'localhost'.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Bem-vindo ao monitor MySQL (...)

    mysql> CREATE USER '' @ 'localhost' IDENTIFICADO POR 'anotherpass';
    Consulta OK, 0 linhas afetadas (0,00 s)

    mysql> Tchau

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / mysql-5.5.sock
    ERRO 1045 (28000): acesso negado para o usuário 'bill' @ 'localhost' (usando a senha: YES)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    ERRO 1045 (28000): acesso negado para o usuário 'bill' @ 'localhost' (usando a senha: YES)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    ERRO 1045 (28000): acesso negado para o usuário 'bill' @ 'localhost' (usando a senha: YES)

Editar 3

A mesma situação da edição 2, agora fornecendo a senha do usuário anônimo.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Bem-vindo ao monitor MySQL (...)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USUÁRIO () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | @localhost |
    + ---------------- + ---------------- +
    1 linha no conjunto (0,01 s)

Conclusão 1, da edição 1: Pode-se autenticar como 'bill'@'%'através de um soquete.

Conclusão 2, da edição 2: Se alguém se conecta através de TCP ou através de um soquete não tem impacto no processo de autenticação (exceto que um não pode se conectar como qualquer outra pessoa, mas 'something'@'localhost'através de um soquete, obviamente).

Conclusão 3, da edição 3: Embora eu tenha especificado -ubill, recebi acesso como usuário anônimo. Isso ocorre devido às "regras de classificação" recomendadas acima. Observe que na maioria das instalações padrão, existe um usuário anônimo sem senha (e deve ser protegido / removido).

RandomSeed
fonte
9
Para quem quer saber por que 'bill' @ 'localhost' corresponde a '@' localhost 'como eu, uma string vazia age efetivamente como um curinga no algoritmo de autenticação do MySQL.
Dean Ou
2
@Sanja Seja extremamente cuidadoso com esta solução alternativa. Você pode permitir acesso anônimo ao seu banco de dados a partir de qualquer local. Em caso de dúvida, eu prefiro excluir o usuário.
RandomSeed
7
@RandomSeed Obrigado por este comentário! Provavelmente eu deveria excluir um usuário anônimo. PS eu encontrei dev.mysql.com/doc/refman/5.1/en/default-privileges.html que diz que esses usuários certamente podem ser excluídos: DROP USER ''@'localhost';. Eles não são necessários para algum propósito especial.
Alex
1
Larguei o usuário anônimo, mas as coisas ainda não funcionaram. Então descobri que precisava emitir também "PRIVILÉGIOS DE LAVAGEM". Seria útil mencionar isso também.
Neeme Praks
2
Esta é a resposta! Por que isso não vem em letras maiúsculas em negrito em todos os manuais do mysql. EXCLUIR O USUÁRIO ANÔNIMO OU MATARÁ TODAS AS SUAS TENTATIVAS DE LOGIN NO LOCALHOST!
Sergei
140

Tentar:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
Edgar Aviles
fonte
10
Isso é bastante perigoso, se alguém invadir sua conta do mysql bill @ localhost, ele terá acesso infinito a todos os bancos de dados do seu servidor mysql.
Adonis K. Kakoulidis
2
Whehey. Eu tive que colocar aspas em torno do meu usuário 'myusername'@'myhost.static.myip.com', então funcionou.
bendecko
Que funciona para mim, mas estou com medo que eu dei demais privilégios para o usuário
Csaba Toth
1
@CsabaThor você fez, reduza os privilégios novamente até que o usuário tenha o que precisa e nada mais.
jwenting 12/09/2015
... e o que você faz se isso lhe der "Acesso negado para o usuário 'root' @ 'localhost' (usando a senha: YES)"?
Grunion Shaftoe
75

Quando você correu

mysql -u bill -p

e recebi este erro

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

O mysqld espera que você se conecte como bill@localhost

Tente criar bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

Se você deseja se conectar remotamente, especifique o nome DNS, o IP público ou 127.0.0.1 usando TCP / IP:

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

Depois de fazer o login, execute este

SELECT USER(),CURRENT_USER();

USER () relata como você tentou se autenticar no MySQL

CURRENT_USER () relata como você pôde se autenticar no MySQL a partir da tabela mysql.user

Isto lhe dará uma visão melhor de como e por que você teve permissão para acessar o mysql. Por que essa visão é importante? Tem a ver com o protocolo de pedidos de autenticação do usuário.

Aqui está um exemplo: vou criar um usuário anônimo no meu desktop MySQL

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql>

OK, assista-me a fazer login como usuário anônimo:

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)

mysql>

O pedido de autenticação é muito rigoroso. Ele verifica do mais específico ao menos. Eu escrevi sobre esse estilo de autenticação no DBA StackExchange .

Não se esqueça de chamar explicitamente o TCP como o protocolo para o cliente mysql quando necessário.

RolandoMySQLDBA
fonte
1
'bill'@'localhost'deve combinar 'bill@%', não deveria?
randomSeed
@ Yak, a ordem de classificação não é baseada apenas na coluna do usuário do mysql.user. O MySQL não faz nenhuma correspondência de caracteres em si. Eu escrevi sobre o protocolo de autenticação de usuário ordenação na DBA Stackexchange: dba.stackexchange.com/a/10897/877
RolandoMySQLDBA
@YaK É por isso que mencionei especificamente SELECT USER(),CURRENT_USER();. Você quase nunca vê usuários anônimos aparecerem nessas duas funções, exceto em configurações realmente ruins.
RolandoMySQLDBA 26/06
1
Eu nunca assumiu a ordem de classificação é baseado apenas em mysql.user. De fato, se você ler minha resposta novamente, verá que eu disse (na verdade, o manual diz) que a ordem de classificação é baseada na hostcoluna primeiro. Você escreveu muito sobre como verificar suas credenciais atuais, mas vejo poucas informações sobre por 'bill'@'localhost'que não é possível fazer login como 'bill'@'%', que é a pergunta de hoje AFAIK. O OP provavelmente tem uma configuração ruim, é por isso que ele recebe esses erros.
randomSeed
2
--protocol=TCPfoi a chave. Muito obrigado!
Lfx #
22

Super tarde para isso

Eu tentei todas essas outras respostas e executei muitas versões diferentes, mysql -u root -pmas nunca apenas


mysql -u root -p

E apenas pressionando [ENTER]a senha.


Uma vez eu fiz isso funcionou. Espero que isso ajude alguém.

garrettmac
fonte
18

Um problema relacionado no meu caso estava tentando se conectar usando:

mysql -u mike -p mypass

Aparentemente, o espaço em branco é permitido entre -u # uname #, mas NÃO entre -p e # password #

Portanto necessário:

mysql -u mike -pmypass

Caso contrário, com espaço em branco entre -p mypass, o mysql usará 'mypass' como o nome db

mstram
fonte
1
ou: mysql -u usrname -p - isto pára ninguém de ver a senha como ele vai cair uma nova linha e pedir a senha sem exibi-lo
Boa resposta @mstram #
Arpit Solanki
1
Esta solução é confortável, no entanto, é inseguro digitar a senha obviamente, mas não é necessário digitar privilégios e definir outras coisas. Portanto, se o seu mac book está protegido - essa abordagem é muito confortável, usei-a ainda mais para importar dados para aws do driver docker mysql.
Dimpiax
17

Quando você digita mysql -u root -p, está se conectando ao servidor mysql através de um soquete unix local.

No entanto, a concessão que você concedeu, 'bill'@'%'corresponde apenas a conexões TCP / IP com curiosidade.

Se você deseja conceder acesso ao soquete unix local, é necessário conceder privilégios para 'bill' @ 'localhost', que curiosamente não é o mesmo que 'bill'@'127.0.0.1'

Você também pode se conectar usando TCP / IP com o cliente de linha de comando mysql, para corresponder aos privilégios que você já concedeu, por exemplo, execute mysql -u root -p -h 192.168.1.123ou o endereço IP local que sua caixa possui.

n
fonte
"'bill' @ '%' corresponde apenas às conexões TCP / IP" Isso está errado. Experimente-o em uma instância limpa (virgem, skip-networking
pronta para uso
@YaK Não consigo fazer com que 'user' @ '%' funcione nessa configuração. O que você quer dizer com isso deveria acontecer?
Nos
Eu poderia conectar como 'bill' @ '%' em uma v5.0 sem rede (portanto, através de um soquete). Qual versão você está usando? Vou tentar em uma v5.5.
randomSeed
Por favor, veja minha resposta atualizada. Consegui fazer login como 'bill'@'%'através de um soquete em uma v5.5.
randomSeed
17

Se você esquecer sua senha ou desejar modificá-la, siga estas etapas:

1: pare seu mysql

[root @ maomao ~] # service mysqld stop
Parando o MySQL: [OK]

2: use “--skip-grant-tables” para reiniciar o mysql

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # # Iniciando o daemon mysqld com bancos de dados em / var / lib / mysql

3: abra uma nova janela e insira mysql -u root

[root @ cy400 ~] # mysql -u root
Bem-vindo ao monitor MySQL. Os comandos terminam com; ou \ g.

4: alterar o banco de dados do usuário

mysql> use mysql
Lendo as informações da tabela para completar os nomes de tabelas e colunas Você pode desativar esse recurso para obter uma inicialização mais rápida com -A Database alterado

5: modifique sua senha, sua nova senha deve ser inserida em "()"

mysql> atualizar usuário definido senha = senha ('root123') em que usuário = 'root';
Consulta OK, 3 linhas afetadas (0,00 s)
Linhas correspondidas: 3 Alteradas: 3 Avisos: 0

6: nivelado

privilégios do mysql> flush;

7: sair

mysql> saia do
Bye

8: reinicie o mysql

[root @ cy400 ~] # serviço mysqld restart;
Parando o MySQL: [OK]
Iniciando o MySQL: [OK]

Bingo! Você pode conectar seu banco de dados com seu nome de usuário e nova senha:

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye
Li Yingjun
fonte
1
Isso me ajudou, mas no mac, se você instalar com o homebrew, é mysql.server stop. No meu caso, não consegui atualizar a coluna do usuário porque não há uma; também não pôde criar um porque está no modo de segurança. Pelo que estou fazendo agora, não me importo, mas realmente aprecio esse formato de resposta com entradas e saídas exatas mostradas. obrigado!
Szeitlin 15/09/16
Sinto muito, nunca usei o mac antes, então não posso ajudá-lo.
Li Yingjun 16/09/16
15

Salve-se de uma grande dor de cabeça ... Seu problema pode ser o fato de você não ter as aspas em torno da senha. Pelo menos foi o meu caso que me desviou por 3 horas.

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

Pesquise "Aqui está um arquivo de opção do usuário típico:" e veja o exemplo que eles indicam lá. Boa sorte, e espero poupar alguém mais algum tempo.

mimoralea
fonte
1
Obrigado por isso. Eu perdi metade do dia com isso e as citações estúpidas em torno da senha fizeram o truque!
guyfromfl
Haha Eu desperdicei praticamente o mesmo quando aconteceu comigo. Feliz por ajudar.
mimoralea
12

A solução é excluir o usuário anônimo (Qualquer)!

Eu também enfrentei o mesmo problema em uma configuração de servidor por outra pessoa. Normalmente, não escolho criar um usuário anônimo ao instalar o MySQL, por isso não havia percebido isso. Inicialmente, entrei como usuário "raiz" e criei alguns usuários "normais" (também conhecidos como usuários com privilégios apenas no dbs com o nome de usuário como prefixo), depois saí e verifiquei o primeiro usuário normal. Não consegui efetuar login. Nem pelo phpMyAdmin nem pelo shell. Acontece que o culpado é esse usuário "Qualquer".

fevangelou
fonte
11

Eu tive um problema semelhante - na minha primeira tentativa de entrar no MySQL, pois rootele me dizia que o acesso era negado. Acontece que eu esqueci de usar o sudo...

Portanto, se você falhar na rootprimeira tentativa, tente:

sudo mysql -u root -p

e digite sua senha, isso deve funcionar.

David Refaeli
fonte
6

A melhor solução que encontrei para mim é.

meu usuário é sonar e sempre que estou tentando conectar ao meu banco de dados a partir de uma máquina externa ou outra, estou recebendo um erro como

ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)

Também como eu estou tentando isso de outra máquina e através do trabalho Jenkins minha URL para acessar é

alm-lt-test.xyz.com

se você quiser se conectar remotamente, poderá especificá-lo de diferentes maneiras, como a seguir:

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

Para acessar isso com o URL, basta executar a seguinte consulta.

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';
Abhijeet Kamble
fonte
4

Ok, não tenho certeza, mas provavelmente este é o arquivo my.cnf no diretório de instalação do mysql, o culpado. Comente esta linha e o problema poderá ser resolvido.

bind-address = 127.0.0.1
Todos
fonte
1
Para mais detalhes, você pode ver isso também wiki.bitnami.org/Components/MySQL
Ali
1
Tenho certeza de que esse não é o problema. Se assim for, o MySQL recusa conexões de qualquer host que não seja 127.0.0.1, e você não receberá um erro SQL 'Acesso Negado'.
O Pellmeister
3

Só queria que você soubesse de uma circunstância incomum: recebi o mesmo erro. Talvez isso ajude alguém no futuro.

Eu havia desenvolvido algumas visualizações básicas, criadas no site de desenvolvimento e transferidas para o site de produção. Mais tarde naquela semana, mudei um script PHP e, de repente, ocorreram erros de acesso negado ao usuário 'local-web-user' @ 'localhost'. O objeto da fonte de dados não havia mudado, então eu me concentrei no usuário do banco de dados no MySQL, me preocupando enquanto alguém invadiu meu site. Felizmente, o resto do site parecia ileso.

Mais tarde, descobriu-se que as opiniões eram os culpados. Nossas transferências de objetos são feitas usando outro usuário (e remoto: admin @ endereço IP) que não o usuário do site local. Portanto, as visualizações foram criadas com 'admin' @ 'endereço IP' como definidor. O padrão SECURITY de criação de exibição é

SQL SECURITY DEFINER

Quando o usuário da web local tenta usar a visualização, ele se depara com os privilégios ausentes do definidor para usar as tabelas. Depois que a segurança foi alterada para:

SQL SECURITY INVOKER

o problema foi resolvido. O problema real era completamente diferente do previsto, com base na mensagem de erro.

Erik
fonte
1
Isso acabou sendo a fonte do meu problema também - uma visão com um "definidor" ausente. Uma maneira rápida de descobrir se isso é o que está acontecendo com você é tentar consultar a mesma tabela ou exibição como raiz - se o fizer, a mensagem de erro será alterada para um muito mais descritivo "ERROR 1449 (HY000): o usuário especificado como um definidor não existe ".
Joshua Davies
3

É uma diferença entre:

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

e

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

Confira:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

O comando

mysql -u bill -p

acesso implícito a 'bill' @ 'localhost' e NÃO a 'bill' @ '%'.

Não há permissões para 'bill' @ 'localhost'

você recebe o erro:

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

resolvendo o problema:

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

grant all privileges on . to 'bill'@'localhost' with grant option;
Gerd
fonte
A declaração de concessão retornou um erro. Eu precisava para especificar um banco de dados assim: conceder todos os privilégios sobre newdb * to .....
LeBird
3

Isso também acontece quando sua senha contém alguns caracteres especiais como @, $, etc. Para evitar essa situação, você pode agrupar a senha entre aspas simples:

$ mysql -usomeuser -p's0mep@$$w0Rd'

Ou então não use a senha ao entrar. Deixe em branco e digite-o quando o terminal solicitar. Esta é a maneira recomendada.

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
Pranit Mais
fonte
3
Isso pode realmente ser um problema (como foi para mim). Todas as minhas senhas para qualquer uma das minhas contas são geradas usando pwgen. Hoje eu criei um novo para um banco de dados MySQL e seu usuário. Infelizmente, a senha continha uma barra invertida "\" que não identifiquei como origem dos erros (nem pensei nisso). Então, procurei por horas uma solução. Depois de definir a senha para "123" em desespero, o login finalmente funcionou. … Os usuários devem estar cientes de que alguns caracteres especiais podem causar problemas, já que o MySQL não mostra nenhum aviso ao usar senhas como "daiy4ha4in7chooshuiphie \ Th * aew", por exemplo.
Arvid
1
Estava prestes a postar isso como uma resposta se ele não tinha aparecido ainda, era simplesmente demasiado longe para baixo na lista para eu aviso (por isso estou batendo-lo +1)
Assimilater
3

Para mim, esse problema foi causado por um novo recurso do MySQL 5.7.2: as userentradas são ignoradas se o plugincampo estiver vazio.

Defina-o como, por exemplo, mysql_native_passwordpara reativá-los:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

Veja as notas de versão do MySQL 5.7.2 , em "Notas de autenticação".

Por alguma razão (talvez porque meus hashes de senha anteriores à 4.1 foram removidos), o mysql_upgradescript não definiu um valor de plug-in padrão.

Descobri percebendo a seguinte mensagem de aviso em /var/log/mysql/error.log:

[Aviso] A entrada do usuário 'foo' @ '%' possui um valor de plug-in vazio. O usuário será ignorado e ninguém poderá mais fazer login com esse usuário.

Eu posto esta resposta aqui para talvez salvar alguém de usar a mesma quantidade ridícula de tempo que eu fiz.

maxelost
fonte
2

Não tenho certeza se alguém vai achar isso útil, mas encontrei o mesmo erro e procurei por todos os usuários anônimos ... e não havia nenhum. O problema acabou sendo que a conta do usuário foi definida como "Requer SSL" - que eu encontrei no PHPMyAdmin, acessando Contas do Usuário e clicando em Editar Privilégios para o usuário. Assim que desmarquei essa opção, tudo funcionou como esperado!

Alan
fonte
2

Resumo da depuração

  • Verifique se há erro de digitação: nome de usuário ou senha.
  • Verifique o nome do host e compare-o com o nome do host da tabela mysql.user.
  • Verifique se o usuário existe ou não.
  • Verifique se o host contém endereço IP ou nome do host.

Há uma grande chance de que você possa ter encontrado esse problema várias vezes em seu trabalho. Esse problema ocorreu-me na maioria das vezes devido à inserção incorreta do nome de usuário ou senha. Embora esse seja um dos motivos, há muitas outras chances de você conseguir esse problema. Às vezes, parece muito semelhante, mas quando você se aprofundar, perceberá vários fatores que contribuem para esse erro. Esta postagem explicará em detalhes, a maioria dos motivos comuns e a solução para esse problema.

Razões possíveis:

  • Caso 1: Erro de digitação: nome de usuário ou senha.

Esse é o motivo mais comum para esse erro. Se você digitou o nome de usuário ou a senha incorretamente, certamente receberá esse erro.

Solução:

A solução para esse tipo de erro é muito simples. Basta digitar o nome de usuário e a senha corretos. Este erro será resolvido. Caso se esqueça da senha, você pode redefinir o nome de usuário / senha. Se você esquecer a senha da conta de administrador / root, existem várias maneiras de redefinir / recuperar a senha de root. Vou publicar outro post sobre como redefinir a senha root caso você esqueça a senha root.

  • Caso 2: Acessando do host errado.

O MySQL fornece restrição baseada em host para acesso do usuário como um recurso de segurança. Em nosso ambiente de produção, costumávamos restringir a solicitação de acesso apenas aos servidores de aplicativos. Esse recurso é realmente útil em muitos cenários de produção.

Solução:

Quando você enfrentar esse tipo de problema, verifique primeiro se o seu host é permitido ou não, verificando a tabela mysql.user. Se não estiver definido, você pode atualizar ou inserir um novo registro na tabela mysql.user. Geralmente, o acesso como usuário raiz a partir de uma máquina remota está desabilitado e não é uma prática recomendada, devido a questões de segurança. Se você tiver requisitos para acessar seu servidor a partir de várias máquinas, conceda acesso apenas a essas máquinas. É melhor não usar curingas (%) e fornecer acessos universais. Deixe-me atualizar a tabela mysql.user, agora o desmontador pode acessar o servidor MySQL a partir de qualquer host.

  • Caso 3: O usuário não existe no servidor.

Esse tipo de erro ocorre quando o usuário que você está tentando acessar não existe no servidor MySQL.

Soluções:

Quando você enfrentar esse tipo de problema, verifique se o usuário existe na tabela mysql.user ou não. Se o registro não existir, o usuário não poderá acessar. Se houver um requisito para esse usuário acessar, crie um novo usuário com esse nome de usuário.

  • Caso 4: mistura de hosts numéricos e baseados em nome.

Pontos importantes

  • Não é aconselhável usar caracteres curinga ao definir o host do usuário, tente usar o nome exato do host.

  • Desative o logon raiz da máquina remota.

  • Use o conceito de usuário proxy.

Existem alguns outros conceitos relacionados a este tópico e entrar em detalhes desses tópicos é um escopo muito diferente deste artigo. Analisaremos os seguintes tópicos relacionados nos próximos artigos.

  • O que fazer, se você esqueceu a senha root no servidor MySQL.
  • Problemas de privilégios do MySQL Access e tabelas relacionadas ao usuário.
  • Recursos de segurança do MySQL com as melhores práticas.

Espero que este post ajude você a corrigir o Código de Erro do MySQL 1045 Acesso negado para o usuário no MySQL.

Abhijit Jagtap
fonte
2

Espero que você não tenha causado mais danos ao excluir o usuário debian-sys-maint no mysql

Tenha seu daemon mysql rodando da maneira normal. Inicie seu cliente mysql como mostrado abaixo

mysql -u debian-sys-maint -p

Em outro terminal, cato arquivo /etc/mysql/debian.cnf. Esse arquivo contém uma senha; cole essa senha quando solicitado.

http://ubuntuforums.org/showthread.php?t=1836919

ysk
fonte
2

Descobri outro caso que parece ser superficial; Eu posso exportar para o sistema de arquivos, via SELECT INTO .. ​​OUTFILE como root, mas não como usuário comum. Embora isso possa ser uma questão de permissões, observei isso e não vejo nada especialmente óbvio. Tudo o que posso dizer é que a execução da consulta como um usuário comum que possui todas as permissões na base de dados em questão retorna o erro de acesso negado que me levou a esse tópico. Quando encontrei a transcrição de um uso bem-sucedido de SELECT INTO ... OUTFILE em um projeto antigo, notei que estava logado como root. Com certeza, quando eu entrei como root, a consulta foi executada conforme o esperado.

David A. Gray
fonte
1

Atualização: Na v8.0.15 (talvez esta versão), a PASSWORD()função não funciona.

Voce tem que:

  1. Certifique-se de ter parado o MySQL primeiro.
  2. Execute o servidor no modo de segurança com desvio de privilégio: sudo mysqld_safe --skip-grant-tables
  3. Conecte-se: mysql -u root
  4. mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mysql> FLUSH PRIVILEGES;
  6. mysql> exit;
  7. Faça login novamente: mysql -u root
  8. mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
Mohamed Jaleel Nazir
fonte
0

Quando você executa mysql -u bill -p, localhosté resolvido para o seu ip, pois é 127.0.0.1 e no seu /etc/hostsarquivo, como o padrão 127.0.0.1 localhostexiste. Portanto, o mysql interpreta você como o bill@localhostque não é concedido bill@'%'. É por isso que existem 2 registros diferentes para o rootusuário no resultado da select host, user from mysql.user;consulta.

Existem duas maneiras de lidar com esse problema.

Um está especificando um ip que não é resolvido inversamente por /etc/hostsarquivo quando você tenta fazer o login. Por exemplo, o ip do servidor é 10.0.0.2. Ao executar o comando mysql -u bill -p -h 10.0.0.2, você poderá fazer login. Se você digitar select user();, você receberá [email protected]. Obviamente, qualquer nome de domínio não deve ser resolvido para este ip no seu /etc/hostsarquivo.

Em segundo lugar, você precisa conceder acesso a esse nome de domínio específico. Para bill@localhost, você deve chamar o comando grant all privileges on *.* to bill@localhost identified by 'billpass';. Neste caso, você será capaz de iniciar sessão com o comando mysql -u bill -p. Uma vez logado, o select user();comando retorna bill@localhost.

Mas isso é apenas para você tentar acessar um servidor mysql no mesmo host. De hosts remotos, o mysql se comporta como esperado, '%' permitirá que você faça o login.

Shnkc
fonte
0

Resolvi isso excluindo as entradas 'bill' do antigo usuário de buggy (esta é a parte importante: do mysql.user e mysql.db ) e criei o mesmo usuário que o triste antes:

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

Trabalhado, o usuário está se conectando. Agora vou remover algumas previlegias dele :)

dxvargas
fonte
0

Eu encontrei o mesmo erro. A configuração que não estava funcionando é a seguinte:

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

A configuração editada abaixo é a que deu certo. Percebe a diferença?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

A diferença é entre aspas duplas. Eles parecem ser bastante significativos no PHP, em oposição ao Java, e têm um impacto quando se trata de caracteres que escapam, configuram URLs e agora passam parâmetros para uma função. Eles são mais bonitos (eu sei), mas sempre use aspas simples o máximo possível, então aspas duplas podem ser aninhadas dentro delas, se necessário.

Este erro surgiu quando testei meu aplicativo em uma caixa Linux, em oposição a um ambiente Windows.

Raymond Wachaga
fonte
0

Eu tive problemas semelhantes porque minha senha contém ";" char quebrando minha senha quando a crio no primeiro momento. Cuidado com isso, se puder ajudá-lo.

Genaut
fonte
0

Isso pode se aplicar a muito poucas pessoas, mas aqui vai. Não use uma exclamação !na sua senha.

Fiz e obtive o erro acima usando o MariaDB. Quando simplifiquei para apenas números e letras, funcionou. Outros caracteres como @e $funcionam bem - usei esses caracteres em um usuário diferente na mesma instância.

A quinta resposta neste endereço me levou à minha solução.

Chiwda
fonte
0

No Windows, veja como resolver:

ERRO 1045 (28000): acesso negado para o usuário 'root' @ 'localhost' (usando a senha: NO)

  1. Desinstale o mysql no painel de controle
  2. Exclua a pasta MySql de C:\Program Files,C:\Program Files (x86)eC:\ProgramData
  3. Instale o mysql
Sanjay
fonte
Tentei todas as outras respostas, finalmente resolvi tentar isso e funcionou!
Jasonoriordan
0

Isso também pode acontecer se o MySQL estiver sendo executado em um sistema operacional que não diferencia maiúsculas de minúsculas, como o Windows.

por exemplo, descobri que a tentativa de conexão com um banco de dados usando essas credenciais falhou:

mysql> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

ERRO 1045 (28000): acesso negado para o usuário 'specialuser'@'10.0.1.113' (usando a senha: YES)

Mas, isso conseguiu:

mysql> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

Digite a senha:

kguest
fonte
0

Hoje em dia! Solução para :

MySQL ERROR 1045 (28000): Acesso negado para o usuário 'user' @ 'localhost' (usando a senha: YES);

Wampserver 3.2.0 - nova instalação ou atualização

Provavelmente xampusando mariaDBcomo padrão está bem.

WampO servidor vem com o mariaDBmysql e instala mariaDBcomo padrão na porta 3306 e o ​​mysql na 3307, às vezes na porta 3308.

Conecte-se a mysql!

Na instalação, ele pede para usar mariaDBou MySql, mas mariaDB está marcado como padrão e você não pode alterá-lo, marque a mysqlopção e instale.

quando a instalação for concluída, ambos estarão mariaDBem execução na porta padrão 3306 e mysqlem outra porta 3307 ou 3308.

Clique com o botão direito do mouse no wampserverícone onde sua execução deve estar no canto inferior direito, vá para ferramentas e veja sua mysqlporta de execução correta .

E inclua-o na sua conexão com o banco de dados, da mesma forma que segue:

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note : Eu estou usando pdo.

Veja aqui para mais: https://sourceforge.net/projects/wampserver/

Dlk
fonte
Por favor, não use backticks para dar ênfase. Eles devem ser usados ​​apenas para código. Palavras como MySQL ou Wampserver não são código.
Dharman 30/01