Erro no MySQL:: 'Acesso negado para o usuário' root '@' localhost '

264

$ ./mysqladmin -u root -p ' redigido '
Digite a senha:

mysqladmin: falha na conexão com o servidor em 'localhost':
'Acesso negado para o usuário' root '@' localhost '(usando a senha: YES)'

Como posso consertar isso?

Harsh Trivedi
fonte
1
@clearlight Não é a mesma pergunta, este post é um problema com o mysqladmin win super privilégios no mysql, o outro post é um problema com uma conexão simples do soquete.
e-info128
Tente remover o ~/.my.cnfarquivo se existir .
e-info128
11
Sei que isso é antigo, mas quero dizer isso para futuros visitantes. Não digite sua senha do mysql, especialmente para root, no próprio comando, ou ela será armazenada no seu histórico do shell. Apenas deixe a -popção sozinha e o mysql solicitará uma senha.
Scotty C.

Respostas:

358
  1. Abra e edite /etc/my.cnfou /etc/mysql/my.cnf, dependendo da sua distribuição.
  2. Adicionar skip-grant-tablesem[mysqld]
  3. Reinicie o Mysql
  4. Você deve conseguir fazer login no mysql agora usando o comando abaixo mysql -u root -p
  5. Corre mysql> flush privileges;
  6. Defina nova senha por ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. Volte para /etc/my.cnf e remova / comente skip-grant-tables
  8. Reinicie o Mysql
  9. Agora você poderá fazer login com a nova senha mysql -u root -p
Kishore Venkataramanan
fonte
6
Olá, tive o mesmo problema. Fiz o procedimento acima e resolvi o problema, mas sempre que reinicio o CentOS, preciso executar todas as etapas novamente (recebi a mensagem: Acesso negado para o usuário 'root' @ 'localhost' (usando a senha: NO) - quando executar o comando mysql (ou qualquer comando SQL) e faço uma e outra vez todo como acima em cada reinicialização.
Eitan
19
Pena que isso não funcione com MariaDB:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Philipp Ludwig
11
Eu encontrei este para trabalhar @PhilippLudwig set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');Eu fiz isso após o passo 5. Aqui é como meu prompt de saída do comando olhou:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
therobyouknow
3
Para a etapa 3, reinicie o MariaDB: Encontrei os seguintes trabalhos:sudo systemctl restart mariadb
therobyouknow
7
Alguns podem encontrar o arquivo em /etc/mysql/my.cnf
DSinghvi 18/18
590

Todas as soluções que encontrei eram muito mais complexas do que o necessário e nenhuma funcionou para mim. Aqui está a solução que resolveu meu problema. Não há necessidade de reiniciar o mysqld ou iniciá-lo com privilégios especiais.

sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

Com uma única consulta, estamos alterando o auth_plugin para mysql_native_password e configurando a senha root como root ( fique à vontade para alterá-la na consulta)

Agora você deve conseguir fazer login com root. Mais informações podem ser encontradas na documentação do mysql

(saia do console mysql com Ctrl + D ou digitando exit )

user1878906
fonte
41
Não consigo fazer isso ... "Você tem um erro na sintaxe SQL; verifique o manual que corresponde à versão do servidor MariaDB para obter a sintaxe correta para usar perto de ...".
TCB13 12/11/17
2
Esta resposta funcionou, eu adicionei acidentalmente não é útil resposta voto, com licença!
7128 taher
25
Funcionou muito bem no Ubuntu 18.04
Almino Melo
2
@ TCB13 e qualquer outra pessoa que esteja enfrentando esse problema. "Não consigo fazer isso ..." Você tem um erro na sintaxe do SQL; verifique o manual que corresponde à versão do servidor MariaDB para a sintaxe correta a ser usada perto de ... ". Use FLUSH PRIVILEGES antes de executar o comando alter
codificador
3
você salvar meu dia :)
xger86x
50

Eu tentei várias etapas para corrigir esse problema. Existem tantas fontes para possíveis soluções para esse problema que é difícil filtrar o sentido das bobagens. Finalmente encontrei uma boa solução aqui :

Etapa 1: identificar a versão do banco de dados

$ mysql --version

Você verá uma saída como esta com o MySQL:

$ mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

Ou imprima assim para o MariaDB:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

Anote qual banco de dados e qual versão você está executando, como você os usará mais tarde. Em seguida, você precisa interromper o banco de dados para acessá-lo manualmente.

Etapa 2: Parando o servidor de banco de dados

Para alterar a senha root, você deve desligar o servidor de banco de dados antecipadamente.

Você pode fazer isso no MySQL com:

$ sudo systemctl stop mysql

E para MariaDB com:

$ sudo systemctl stop mariadb

Etapa 3: Reiniciando o servidor de banco de dados sem verificação de permissão

Se você executar o MySQL e o MariaDB sem carregar informações sobre os privilégios do usuário, ele permitirá que você acesse a linha de comando do banco de dados com privilégios de root, sem fornecer uma senha. Isso permitirá que você obtenha acesso ao banco de dados sem saber.

Para fazer isso, é necessário parar o banco de dados de carregar as tabelas de concessão, que armazenam informações sobre privilégios do usuário. Como esse é um risco à segurança, você também deve pular a rede também para impedir que outros clientes se conectem.

Inicie o banco de dados sem carregar as tabelas de concessão ou ativar a rede:

$ sudo mysqld_safe --skip-grant-tables --skip-networking &

Oe comercial no final deste comando fará com que esse processo seja executado em segundo plano, para que você possa continuar usando o seu terminal.

Agora você pode se conectar ao banco de dados como usuário root, o que não deve solicitar uma senha.

$ mysql -u root

Você verá imediatamente um prompt de shell do banco de dados.

Prompt do MySQL

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

mysql>

Prompt do MariaDB

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

MariaDB [(none)]>

Agora que você tem acesso root, pode alterar a senha root.

Etapa 4: Alterando a senha root

mysql> FLUSH PRIVILEGES;

Agora podemos alterar a senha do root.

Para o MySQL 5.7.6 e mais recente , bem como o MariaDB 10.1.20 e mais recente , use o seguinte comando:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

Para o MySQL 5.7.5 e anterior , bem como o MariaDB 10.1.20 e anterior , use:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

Certifique-se de substituir new_passwordpor sua nova senha de escolha.

Nota: Se o ALTER USERcomando não funcionar, geralmente é indicativo de um problema maior. No entanto, você pode tentar UPDATE ... SETredefinir a senha root.

[IMPORTANTE] Esta é a linha específica que corrigiu meu problema específico:

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

Lembre-se de recarregar as tabelas de concessão depois disso.

Em qualquer um dos casos, você deverá ver a confirmação de que o comando foi executado com sucesso.

Query OK, 0 rows affected (0.00 sec)

A senha foi alterada; portanto, agora você pode parar a instância manual do servidor de banco de dados e reiniciá-la como antes.

Etapa 5: reiniciar o servidor de banco de dados normalmente

O tutorial segue algumas etapas adicionais para reiniciar o banco de dados, mas a única peça que usei foi esta:

Para o MySQL, use: $ sudo systemctl start mysql

Para MariaDB, use:

$ sudo systemctl start mariadb

Agora você pode confirmar que a nova senha foi aplicada corretamente executando:

$ mysql -u root -p

O comando agora deve solicitar a senha recém-atribuída. Digite-o e você deverá obter acesso ao prompt do banco de dados conforme o esperado.

Conclusão

Agora você tem acesso administrativo ao servidor MySQL ou MariaDB restaurado. Verifique se a nova senha root que você escolhe é forte e segura e mantenha-a em local seguro.

Blairg23
fonte
1
A instrução ALTER USER foi introduzida no MariaDB 10.2.0.
Benoit Desrosiers
2
Uau ! esta linha mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';tem sido um salva-vidas para mim!
Lucyjosef 22/03/19
35

Nenhuma das respostas acima me ajudou com esse problema, então aqui está a solução que encontrei .

A parte relevante:

Nos sistemas Ubuntu executando o MySQL 5.7 (e versões posteriores), o usuário root do MySQL é configurado para autenticar usando o plugin auth_socket por padrão, e não com uma senha. Isso permite maior segurança e usabilidade em muitos casos, mas também pode complicar as coisas quando você precisa permitir que um programa externo (por exemplo, phpMyAdmin) acesse o usuário.

Para usar uma senha para conectar-se ao MySQL como root, você precisará mudar seu método de autenticação de auth_socket para mysql_native_password. Para fazer isso, abra o prompt do MySQL no seu terminal:

sudo mysql

Em seguida, verifique qual método de autenticação cada uma das suas contas de usuário MySQL usa com o seguinte comando:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Resultado

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

Neste exemplo, você pode ver que o usuário root realmente se autentica usando o plugin auth_socket. Para configurar a conta raiz para autenticar com uma senha, execute o seguinte comando ALTER USER. Certifique-se de alterar a senha para uma senha forte de sua escolha e observe que este comando alterará a senha raiz que você definiu na Etapa 2:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Em seguida, execute FLUSH PRIVILEGES, que instrui o servidor a recarregar as tabelas de concessão e colocar suas novas alterações em vigor:

FLUSH PRIVILEGES;

Verifique os métodos de autenticação empregados por cada um de seus usuários novamente para confirmar se o root não se autentica mais usando o plugin auth_socket:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Resultado

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

Você pode ver neste exemplo de saída que o usuário root do MySQL agora se autentica usando uma senha. Depois de confirmar isso em seu próprio servidor, você pode sair do shell do MySQL:

exit

sonrad10
fonte
27

Para usuários do Ubuntu / Debian

( pode funcionar em outras distribuições, especialmente as baseadas em debian)

Execute o seguinte para conectar-se como root(sem nenhuma senha)

sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf

Se você não deseja adicionar --defaults-filecada vez que deseja se conectar como root, pode copiar /etc/mysql/debian.cnfpara o diretório inicial:

sudo cp /etc/mysql/debian.cnf ~/.my.cnf

e depois:

sudo mysql
Fab
fonte
2
Isso foi tudo o que foi preciso. 'root' não é 'root' no Ubuntu por padrão, aparentemente.
Chaim Eliyah
21

Depois de tentar todas as outras respostas, é isso que finalmente funcionou para mim

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

Encontrei a resposta neste post: https://medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06

Pico12
fonte
1
ESTA LINHA DE PLUGIN É REALMENTE ÚTIL. Eu tentei um monte de compinations mas esta é a única trabalhou para Ver 14,14 Distrib 5.7.27, para Linux (x86_64)
AlexNikonov
2
Isso me ajudou com o mysql 5.7 também. Então, aplicável não só para MariaDB
podarok
Eu apenas usei isso no MySQL 8 Ubuntu 20.04 e funcionou. Outras respostas usando skip-grant-table(my.conf ou no mysqlcomando) não funcionaram. Eu poderia entrar usando uma conta de serviço ( askubuntu.com/a/120769/169836 ), mas UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';não funcionou. Somente quando usando a parte do plugin as coisas funcionaram. Obrigado ~
hamx0r 30/04
16

Para novos usuários do Linux, isso pode ser uma tarefa assustadora. Deixe-me atualizar isso com o mysql 8 (a versão mais recente disponível no momento é 8.0.12, em 12 de setembro de 2018)

  1. Abra o arquivo de configuração "mysqld.cnf" em "/etc/mysql/mysql.conf.d/".
  2. Adicione skip-grant-tables à próxima linha do texto [mysql] e salve.
  3. Reinicie o serviço mysql como "sudo service mysql restart". Agora seu mysql está livre de qualquer autenticação.
  4. Conecte-se ao cliente mysql (também conhecido como mysql-shell) como mysql -u root -p . Não há senha a ser digitada a partir de agora.
  5. executar privilégios de liberação do comando sql ;
  6. Redefina a senha agora como ALTER USER 'root' @ 'localhost' IDENTIFICADO POR 'MyNewPassword';
  7. Agora vamos voltar ao estado normal; remova essa linha "skip-grant-tables" de "mysqld.cnf" e reinicie o serviço.

É isso aí.

Amit Kr
fonte
5

No seu ambiente de trabalho MySQL, você pode ir para a barra lateral esquerda, em Gerenciamento, selecionar "Usuários e privilégios", clicar na raiz em Contas de usuário e, na seção direita, clicar na guia "Limites de conta" para aumentar o máximo de consultas, atualizações, etc. clique na guia "Funções administrativas" e marque as caixas para conceder acesso à conta. Espero que ajude!

Colleen Purcell
fonte
4

Eu fiz isso para definir minha senha root na configuração inicial do MySQL no OSx. Abra um terminal.

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

Feche o terminal e abra um novo terminal. E os seguintes são trabalhados no Linux, para definir a senha root.

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-tables: Isso não funcionou para mim na primeira vez. Mas, na segunda tentativa, foi o sucesso.)

Então entre no MySQL

mysql -u root

FLUSH PRIVILEGES;

Agora mude a senha:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

Reinicie o MySQL:

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start
Sadee
fonte
3

No meu caso no Debian 10, o erro

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

foi resolvido por (BOA MANEIRA)

sudo mysql -u root -p mysql

MANEIRA RUIM:

mysql -u root -p mysql
klor
fonte
3

Ugh- nada funcionou para mim! Eu tenho uma máquina CentOS 7.4 executando o mariadb 5.5.64.

O que eu tinha que fazer era isso, logo após a instalação do mariadb do yum;

# systemctl restart mariadb
# mysql_secure_installation

O mysql_secure_installationguiará por várias etapas, incluindo "Definir senha root? [S / n]". Apenas diga "y" e dê uma senha. Responda as outras perguntas como desejar.

Então você pode entrar com sua senha, usando

# mysql -u root -p

Vai sobreviver

# systemctl restart mariadb

A chave

Depois, verifiquei o /bin/mysql_secure_installationcódigo-fonte para descobrir como era magicamente capaz de alterar a senha root e nenhuma das outras respostas aqui conseguiu. O bit de importação é:

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

... Diz SET Password=...e não SET authentication_string = PASSWORD.... Portanto, o procedimento apropriado para esta versão (5.5.64) é:

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

No prompt do mysql>:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

mate o mysqld_safe em execução. reinicie o mariadb. Entrar como root: mysql -u -p. Use sua nova senha.

Se desejar, você pode definir todas as senhas raiz de uma só vez. Eu acho que isso é sábio:

mysql -u root -p
(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

Isso executará atualizações em todas as senhas raiz: ou seja, para "localhost", "127.0.0.1" e ":: 1"

No futuro, quando eu for para o RHEL8 ou o que você tem, tentarei me lembrar de verificar a / bin / mysql_secure_installation e ver como os caras fizeram isso, quem configurou o mariadb para este sistema operacional.

Mike S
fonte
2

Se você é como eu e todas as sugestões acima falharam, prossiga com a desinstalação de todas as versões do mysql em sua máquina, procure todos os arquivos mysql restantes usando este comando sudo find / -name "mysql"e rm -rftodos os arquivos ou diretórios com o nome do mysql anexado (você deve pular arquivos relacionados para bibliotecas de linguagens de programação). Agora instale uma nova versão do MySQL e aproveite. Nota: você perderá todos os seus dados, portanto pese suas opções primeiro.

Michael Ogala
fonte
1

Isso pode acontecer se você não tiver privilégios suficientes. Digite su, digite a senha root e tente novamente.

vitaly goji
fonte
1

Ok, eu sei que esse é um tópico antigo, mas se você chegou a esta página pelo Google como eu e nenhuma das soluções acima funcionou, o que acabou por ser o erro foi 100% tolice do meu lado. Não me conectei ao servidor. Uma vez conectado, tudo foi tranquilo.

Caso ajude a conhecer minha configuração, estou usando o Sequel Pro e tentando conectar-me ao Node usando o pacote NPM, mysql. Eu não achei que precisava me conectar (exceto executar o Sequel Pro) porque já estava fazendo isso no meu aplicativo.

insira a descrição da imagem aqui

Mix Master Mike
fonte
0

Solução: Desista!

Ouça-me, passei cerca de dois dias inteiros tentando fazer o MySQL funcionar sem sucesso, sempre preso a erros de permissão, nenhum dos quais foi corrigido pelas respostas neste tópico. Chegou ao ponto em que pensei que, se continuasse, ficaria louco.

Com paciência para fazê-lo funcionar, enviei o comando para instalar o SQLite, usando apenas 450 KB, e funcionou perfeitamente desde o início.

Se você não tem a paciência de um santo, vá com o SQLite e economize muito tempo, esforço, dor e espaço de armazenamento ..!

ArraysStartAt1
fonte