ERRO 1698 (28000): Acesso negado para usuário 'root'@'localhost'

I'estou a configurar um novo servidor e continuo a correr para este problema.

Quando tento entrar no banco de dados MySQL com o usuário root, eu recebo o erro:

ERROR 1698 (28000): Acesso negado para o utilizador 'root'@'localhost'

Não importa se eu me conecto através do terminal (SSH), através do PHPMyAdmin ou de um cliente MySQL, por exemplo o Navicat. Todos eles falham.

Eu olhei na tabela do mysql.user e consegui o seguinte:

+------------------+-------------------+
| user             | host              |
+------------------+-------------------+
| root             | %                 |
| root             | 127.0.0.1         |
| amavisd          | localhost         |
| debian-sys-maint | localhost         |
| iredadmin        | localhost         |
| iredapd          | localhost         |
| mysql.sys        | localhost         |
| phpmyadmin       | localhost         |
| root             | localhost         |
| roundcube        | localhost         |
| vmail            | localhost         |
| vmailadmin       | localhost         |
| amavisd          | test4.folkmann.it |
| iredadmin        | test4.folkmann.it |
| iredapd          | test4.folkmann.it |
| roundcube        | test4.folkmann.it |
| vmail            | test4.folkmann.it |
| vmailadmin       | test4.folkmann.it |
+------------------+-------------------+

Como você pode ver, a raiz deve ter acesso.

O Servidor é bastante simples, pois já há algum tempo que tento resolver este problema.

It's rodando Ubuntu 16.04.1 LTS com Apache, MySQL e PHP, para que ele possa hospedar websites, e iRedMail 0.9.5-1, para que ele possa hospedar emails.

O login na base de dados MySQL funciona bem antes de eu instalar o iRedMail. Eu também tentei, apenas instalando o iRedMail, mas depois root, também não funciona't...

Se alguém me pudesse dizer como corrijo o meu problema de login MySQL ou como instalo o iRedMail, em cima de uma instalação MySQL existente. E sim eu tentei o Dicas de Instalação e eu posso't encontrar essas variáveis nos arquivos de configuração.

Solução

Alguns sistemas como o Ubuntu, mysql está usando por padrão o UNIX auth_socket plugin.

Basicamente significa isso: db_users using it, will be "auth" by the system user credentias. You can see if your root user is set up like this by doing the following:

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;

+------------------+-----------------------+
| User             | plugin                |
+------------------+-----------------------+
| root             | auth_socket           |
| mysql.sys        | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+

Como você pode ver na consulta, o usuário root está utilizando o plugin `auth_socket'.

Há duas maneiras de resolver isto:

  1. Você pode configurar o usuário root para utilizar o plugin mysql_native_password.
  2. Você pode criar um novo db_user com você system_user (recomendado)

Opção 1: Opção 1:

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart

Opção 2: (substitua YOUR_SYSTEM_USER pelo nome de usuário que você tem)

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY '';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart

Lembre-se que se você utilizar a opção #2 you'terá que se conectar ao mysql como seu nome de usuário do sistema (mysql -u YOUR_SYSTEM_USER)

Nota: Em alguns sistemas (por exemplo, Debian stretch) 'auth_socket' plugin é chamado 'unix_socket', então o comando SQL correspondente deve ser: UPDATE user SET plugin='unix_socket' WHERE User='YOUR_SYSTEM_USER';

Actualização: de @andy's comment seems that mysql 8.x.x.x updated/replaced the auth_socket for caching_sha2_password I don't have a system setup with mysql 8.x.x.x to test this, however the steps above should help you to understand the issue. Aqui's a resposta:

Uma alteração a partir do MySQL 8.0.4 é que o novo plugin de autenticação padrão é 'caching_sha2_password'. O novo 'YOUR_SYSTEM_USER' terá este plugin auth e você pode fazer login a partir da shell bash agora com "mysql -u YOUR_SYSTEM_USER -p" e fornecer a senha para este usuário no prompt. Não é necessário o "UPDATE user SET plugin" passo. Para a atualização padrão do plugin auth 8.0.4 veja, https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/

Comentários (23)

Sugiro que se retire a ligação Mysql...

UPDATE-Esta é para a versão Mysql 5.5, se a sua versão for diferente, por favor mude a primeira linha de acordo

sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-core-5.5 mysql-client-core-5.5
sudo rm -rf /etc/mysql /var/lib/mysql
sudo apt-get autoremove
sudo apt-get autoclean

E Instale novamente Mas desta vez defina você mesmo uma senha de root. Isto vai poupar muito esforço.

sudo apt-get update
sudo apt-get install mysql-server
Comentários (3)

Você quer acessar o MySQL com o usuário root mas você'não está fornecendo a senha correta do root's.

Se você precisa **setar uma nova senha para root***, o site MySQL's tem uma ótima documentação sobre como fazê-lo: http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

I'll não mostrar o processo aqui porque a minha documentaçãoql no link acima sso's é claro e conciso.

Comentários (3)