Published on

Erro de autenticação ao instalar MySQL

Authors

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:

  1. Mudar o plugin de autorização do root de auth_socket para mysql_native_password.
  2. 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:

  1. https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost
  2. https://stackoverflow.com/questions/36099028/error-1064-42000-you-have-an-error-in-your-sql-syntax-want-to-configure-a-pa