Comment corriger l'erreur ERROR 1698 (28000): Access denied for user 'root'@'localhost' ?

Comment corriger l'erreur ERROR 1698 (28000): Access denied for user 'root'@'localhost' ? Le problème provient de la manière dont Mysql gère l'authentification. Sur certaines distributions Linux, la base de données n'utilise pas son plugin natif.

Si vous utilisez un système de gestion de bases de données depuis un système d'exploitation Linux, vous pouvez rencontrer l'erreur "ERROR 1698 (28000): Access denied for user 'root'@'localhost'" en tentant de vous connecter en tant que "root". En cause : la façon dont Mysql gère le système d'authentification sur certains systèmes d'exploitation Linux.

Sur un système comme Ubuntu, Mysql utilise un plugin différent du plugin natif. Vous pouvez le voir en vous connectant grâce à la commande "sudo mysql" puis en effectuant une requête sur la table "user".

sudo mysql -u root
mysql> USE mysql;
mysql> SELECT User, plugin FROM mysql.user;
User             | plugin                |
+------------------+-----------------------+
| root             | auth_socket

Si le plugin est défini sur "auth_socket", alors cela signifie que le compte administrateur de votre base de données est lié au compte administrateur de votre système. Il faut vous connecter avec ces informations car les deux sont liés. Si vous souhaitez contourner ce problème, la solution recommandée est de créer un compte administrateur de votre base de données qui sera lié à votre compte utilisateur. Vous pouvez également supprimer cette liaison en changeant le plugin d'authentification du compte "root". Depuis la version 8 de Mysql, ce problème n'existe plus car Mysql utilise par défaut pour tous les comptes le nouveau plugin d'authentification "caching_sha2_password".

Pour créer votre compte utilisateur, vous devez indiquer le même nom. On se sert pour cela de la requête "CREATE USER".

CREATE USER 'VOTRE_UTILISATEUR_SYSTEME'@'adresse_ip_du_serveur' IDENTIFIED BY '';

Avec la requête "GRANT", on peut attribuer des privilèges à un utilisateur. La directive "ALL PRIVILEGES", en indiquant comme objet "*", donne tous les droits à l'utilisateur sur toutes les entités de la base de données, comme un compte administrateur.

GRANT ALL PRIVILEGES ON *.* TO 'VOTRE_UTILISATEUR_SYSTEME'@'adresse_ip_du_serveur';

Il faut ensuite "lier" le compte de la base de données à votre compte utilisateur. Pour cela, il faut indiquer le plugin "auth_socket" comme plugin d'authentification. Attention, sur certains systèmes, le plugin peut s'appeler "unix_socket". Vous pouvez vous en rendre compte avec la première requête de cet article.

UPDATE user SET plugin='auth_socket' WHERE User='VOTRE_UTILISATEUR_SYSTEME';

Pour finir, la requête "FLUSH PRIVILEGES" recharge la gestion des droits de la base de données à partir des tables contenant ces informations.

FLUSH PRIVILEGES

Vous pouvez maintenant administrer la base de données avec le compte utilisateur de votre machine une fois que vous aurez redémarré le service Mysql.

Si vous souhaitez supprimer la liaison entre le compte "root" de la base de données et celui de votre machine, il faut utiliser une requête et changer le plugin d'authentification pour utiliser à la place le plugin natif de Mysql. Il faut comme pour la méthode précédente recharger les privilèges et redémarrer le service Mysql.

UPDATE user SET plugin='auth_socket' WHERE User='root';
FLUSH PRIVILEGES;