mysql como corrigir Acesso negado para o usuário 'root' @ 'localhost'

123

Antes de eu estragar alguma coisa, quando eu faço login usando $ mysql -u root -pe mostro bancos de dados:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| game_data          |
| test               |
+--------------------+

Então tentei criar um novo usuário e percebi que algo estava errado com os PRIVILEGES.

Então, excluí os novos usuários e acho que removi acidentalmente o 'root' e o 'Admin'.

Então, tento criar 'root' novamente, mas recebo o erro de acesso negado ao conceder todos os privilégios.

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Se eu entrar no MySQL novamente usando $ mysql -u root -pe mostrar bancos de dados,

+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

Todos os outros bancos de dados se foram.

Como faço para corrigir o MySQL agora?

Não consigo encontrar o banco de dados 'mysql', não consigo criar banco de dados, criar usuário, qualquer coisa que eu tente fazer receberá um erro.

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

Devo reinstalar o MySQL usando MacPorts? Se reinstalar, perderei o banco de dados game_data, certo?

Vogelsire
fonte
Tente acessar o servidor com 'root'@'127.0.0.1', que é diferente de 'root' @ 'localhost'. Em seguida, emita um comando para criar o usuário 'root' @ 'localhost' e conceda todos os privilégios a ele.
Gimmy
Veja também Como o MySQL habilita o usuário root? no Superusuário. Ele tenta evitar a redefinição de senhas.
JWW
Eu só tinha um espaço entre -pe a senha. Eu sei que é bobagem, mas pode ajudar alguém.
Vinay Wadhwa 23/02

Respostas:

132

Siga os passos abaixo.

  1. Inicie a instância ou daemon do servidor MySQL com a --skip-grant-tablesopção (configuração de segurança).

    $ mysqld --skip-grant-tables
    
  2. Execute essas instruções.

    $ mysql -u root mysql
    $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root';
    $mysql> FLUSH PRIVILEGES;
    

Se você enfrentar o campo desconhecido Erro de senha acima, use:

update user set authentication_string=password('my_password') where user='root';
  1. Por fim, reinicie a instância / daemon sem a --skip-grant-tablesopção

    $ /etc/init.d/mysql restart
    

Agora você deve conseguir se conectar com sua nova senha.

$ mysql -u root -p

Digite a senha: my_password

Correção para o erro "Não é possível bloquear o ibdata1" do MySQL

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak
sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak
sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak
sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1
sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0
sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1
sudo /etc/init.d/mysql restart
Yogus
fonte
1
"$ mysqld --skip-grant-tables" e "InnoDB: Não foi possível bloquear ./ibdata1, erro: 35 InnoDB: Verifique se você ainda não possui outro processo mysqld InnoDB: usando os mesmos dados ou arquivos de log do InnoDB."?
veja minha atualização acima
Yogus 3/13
Descobri que parar mysql antes de emitir a 1ª comando pára o erro de bloqueio de acontecer - Paragem mysql serviço
Frank Tzanabetis
7
Aparentemente, a coluna 'senha' não existe mais ... foi substituída por 'authentication_string'. Portanto, a seqüência de atualização da senha é agora: UPDATE user SET authentication_string = PASSWORD ('minha_password') em que USER = 'root';
Jdmcnair 23/12/15
1
Obrigado! E agora estou curioso: o que poderia ter causado isso? No Windows?
Ilia Andrienko
64

Nenhuma das opções acima foi útil para mim. Eu descobri que precisava limpar o método de plug-in. Na 5.6, eu poderia fazer:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;

Em 5.7, eu achei que precisava:

sudo mysql -u root
use mysql;
[mysql] update user set plugin='mysql_native_password' where User='root';
[mysql] flush privileges;

De acordo com os documentos, com o plug-in definido como uma string vazia, ele deve ter efetivamente assumido o padrão mysql_native_password, mas pode estar ficando confuso com um hash de senha vazio. Para obter mais nuances, você pode ler a documentação aqui: https://dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html

Mario Olivio Flores
fonte
5
Isso resolveu para mim. Quando observei o status do daemon mysql, vi este aviso: "[Aviso] 'entrada do usuário' root @ localhost 'possui uma senha e um plug-in de autenticação especificados. A senha será ignorada." Definir o plug-in como '' me permitiu fazer login novamente. Obrigado, Mario Flores
SpacePope
Meu plug-in estava em branco. O engraçado é que ele muda para branco automaticamente. Observe que estou falando de uma instalação no meu computador pessoal onde uso dist-upgrades, portanto, esse pode ser o motivo pelo qual o usuário root quebrou.
Friend of Kim
2
set plugin='mysql_native_password'fez isso por mim, obrigado! Para referência: dev.mysql.com/doc/refman/5.7/en/…
Koen.
Por que isso ainda é um problema para instalações instaladas desde 2018?
Mckenzm 01/10/19
1
ubuntu 18, e funcionou
Rahal Kanishka
8

Verifique também se o registro necessário na tabela userpossui um plugincampo vazio (pode haver, por exemplo, "unix_socket").

Desde a versão 5.5.7, o mysql possui vários plugins de autenticação, https://dev.mysql.com/doc/refman/5.6/en/authentication-plugins.html

Portanto, se você tiver um plugincampo não vazio , a senha será ignorada e haverá um aviso no log de erros do mysql (para mim é /var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.

d9k
fonte
1
Para outra pessoa que atravessa isso, ao executar o servidor mysql 5.7.15, isso realmente bloqueia o usuário se você não fornecer um plugin. Provavelmente o que você está procurando é um plugindos mysql_native_password.
Jonathan Cantrell
8
grep 'temporary password' /var/log/mysqld.log
Sort date (newest date)

Você pode ver algo assim;

[root@SERVER ~]# grep 'temporary password' /var/log/mysqld.log
2016-01-16T18:07:29.688164Z 1 [Note] A temporary password is generated for root@localhost: O,k5.marHfFu
2016-01-22T13:14:17.974391Z 1 [Note] A temporary password is generated for root@localhost: b5nvIu!jh6ql
2016-01-22T15:35:48.496812Z 1 [Note] A temporary password is generated for root@localhost: (B*=T!uWJ7ws
2016-01-22T15:52:21.088610Z 1 [Note] A temporary password is generated for root@localhost: %tJXK7sytMJV
2016-01-22T16:24:41.384205Z 1 [Note] A temporary password is generated for root@localhost: lslQDvgwr3/S
2016-01-22T22:11:24.772275Z 1 [Note] A temporary password is generated for root@localhost: S4u+J,Rce_0t
[root@SERVER ~]# mysql_secure_installation

Protegendo a implantação do servidor MySQL.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password:

Se você vê, diz

... Failed! Error: Your password does not satisfy the current policy requirements
That means your password needs to have a character such as ! . # - etc...
mix characters well, upper case, lower case, ! . , # etc...

New password: 

Re-enter new password: 
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : Y

New password: 

Re-enter new password: 

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done! 
[root@SERVER ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.10 MySQL Community Server (GPL)

Assista aos últimos 10 minutos deste vídeo , ele ensina como você faz.

Tadeh
fonte
Embora isso possa responder à pergunta, você deve fornecer uma descrição mais detalhada do conteúdo vinculado e explicar como ele se relaciona com a pergunta. Isso ajudará a garantir que essa resposta permaneça útil no caso de a página vinculada ser removida ou ficar offline. Para mais informações, consulte esta publicação do Meta Stack Exchange .
precisa saber é o seguinte
Este é o caso de uso que eu vi, estou instalando o mysql no RHEL7 no AWS com Ansible e estou obtendo o mesmo comportamento após reconfigurar e reiniciar o banco de dados. Você sabe por que isso acontece em primeiro lugar, está impedindo o Ansible de acessar o mysqld local e configurá-lo. Isso é apenas para fins de teste.
einarc
Aparentemente, depende de como você inicializa o servidor, veja a etapa 4 aqui: dev.mysql.com/doc/refman/5.7/en/…
einarc
3

Tente:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;
Gustavo Duarte
fonte
6
Você pode descrever o que os --no-defaults --forceswitches fazem? Caso contrário, é uma duplicata do VLQ da resposta aceita acima.
Canadian Luke
O @CanadianLuke nenhum padrão ignora qualquer arquivo de configuração presente que, de outra forma, incluiria, force continua a operação, mesmo se algum dos comandos SQL emitidos falhar. Em caso de dúvida, consulte o manual
deucalion
3
Ele precisa ser editado para a resposta
canadense Luke
2
Eu receboERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Jonathan
1
@JonathanLeaders look: stackoverflow.com/questions/30692812/…
Gustavo Duarte
3

No meu caso, eu estava com um banco de dados corrompido, depois de reiniciar o mysql no Debian, o login root estava sem senha. A solução foi esta:

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

Algumas outras respostas também mencionaram o plug-in native_password, mas é assim que você pode fazê-lo sem mexer muito. É assim que deve ser mudado.

John
fonte