- Published on
Erro de autenticação ao instalar MySQL
- Authors
- Name
- Pedro Martins Pereira
- @AbstracaoL
O problema
Ao instalarmos o MySQL, duas contas com todos os privilégios são criadas: root@localhost, sem senha, mas que precisa ser acessada como root. E 'mysql@localhost', que também não tem senha, mas precisamos acessar através do usuário 'mysql'. Em geral, nos conectaríamos ao usuário mysql e trocaríamos a senha de 'mysql@localhost'. Entretanto eu em versões mais novas do MySQL entrar o comando
mysql -u root -p
no terminal e simplesmente apertar return no pedido da senha retornará o erro:
ERROR 1698 (28000): Acess denied for user 'root'@'localhost'
Nesse artigo explicarei porque isso ocorre e como soluicionar esse problema.
Nota: Estou utilizando o fork da comunidade do MySQL chamado MariaDB, entratanto esse não é um problema particular dessa versão do MySQL, tendo sido documentado em ambas implementações.
Causa 1
Em algumas versões do MySQL o problema se resumirá aos db_users utilizando "auth" das credenciais do usuário do sistema. Para checar se esse é o caso para seu root, basta fazer o seguinte:
sudo mysql -u root
mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;
O que retornará a tabela:
+------------------+-----------------------+
| User | plugin |
+------------------+-----------------------+
| root | auth_socket |
| mysql.sys | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------
Podemos ver aqui que o usuário 'root' está utilizando o plugin auth_socket.
Soluções
Há duas soluções possíveis caso esse seja o problema:
- Mudar o plugin de autorização do root de auth_socket para mysql_native_password.
- Criar um novo db_user utilizando o seu system_user.
Opção 1
λ sudo mysql -u root
mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;
λ sudo systemctl restart mariadb.service
Opção 2
λ sudo mysql -u root
mysql> USE mysql;
mysql> CREATE USER 'SEU_USUARIO_AQUI'@'localhost' IDENTIFIED BY 'sua_SENHA';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'SEU_USUARIO_AQUI'@'localhost';
mysql> UPDATE user SET plugin='auth_socket' WHERE User='SEU_USUARIO_AQUI';
mysql> FLUSH PRIVILEGES;
mysql> exit;
λ sudo systemctl restart mariadb.service
Causa 2
Em versões mais novas do MySQL, é possível que o plugin de autenticação esteja correto e ainda assim o erro persista.
Solução
λ mysql -u root -p
E em seguida trocar a senha com:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'SUA_SENHA_AQUI';
Por fim, reiniciar o serviço através de:
λ sudo systemctl restart mariadb.service
Ou equivalente.
Agora ao logar com mysql -u root -p, a senha que você entrou no comando anterior será a utilizada!
Referências:
- https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost
- https://stackoverflow.com/questions/36099028/error-1064-42000-you-have-an-error-in-your-sql-syntax-want-to-configure-a-pa