6.13 Causes des erreurs "Access denied"

L'erreur " Access denied " (accès refusé) peut survenir lors d'une tentative de connexion à MySQL. Voici une liste de problème type qui peuvent être la cause d'un tel comportement, et leur solution :

  • Avez vous exécuté le script mysql_install_db après avoir installé MySQL, pour créer les premières lignes dans les tables de droits ? Si non, faites le. 6.10 Droits initiaux. Testez les droits initaux en exécutant la commande suivante :
shell> mysql -u root test

Le serveur doit vous autoriser la connexion sans erreur. Assurez vous aussi que vous avez un fichier appelé ``user.ISD'' dans le dossier de MySQL. Généralement, il se trouve là : ``PATH/var/mysql/user.ISD'', Avec PATH qui représente le chemin jusqu'à la racine de l'installation de MySQL.

  • Après une installation, il vaut mieux vous connecter au serveur, et mettre en place des utilisateurs et leur permissions.
shell> mysql -u root mysql

Le serveur autorisera la connexion car l'utilisateur MySQL root n'a pas de mot de passe à l'origine. Etant donné que cela crée un gros risque au niveau de la sécurité de la base, affecter un mot de passe à l'utilisateur root doit être une priorité lorsque vous créez les utilisateurs de votre serveur. Si, lors de la connexion en tant que root , vous obtenez l'erreur suivante :

Access denied for user: '@unknown' to database mysql

Cela signifie que vous n'avez pas de ligne dans la table user avec la valeur 'root' dans la colonne User et que mysqld n'a pas pu trouver votre hôte dans cette table. Dans ce cas, vous devez redémarrer le serveur avec l'option --skip-grant-tables et éditer les fichiers ``/etc/hosts'' ou ``\windows\hosts'' pour ajouter une ligne pour votre hôte.

  • Si vous avez fait la mise à jour depuis une version antérieure à 3.22.11 vers une version 3.22.11 ou plus récente, avez vous exécuté le script mysql_fix_privilege_tables? Si non, faites le. La structure des tables de droits a évolé avec la version 3.22.11 lorsque la commande GRANT a été ajoutée.
  • Si vous avez modifié directement la table de droit (avec les commandes INSERT ou UPDATE) et que vos modifications n'ont pas été prise en compte, n'oubliez pas qu'il faut exécuter une commande FLUSH PRIVILEGES ou mysqladmin flush-privileges pour forcer le serveur à recharger les nouvelles valeurs. Sinon, vos modifications n'auront pas d'effet jusqu'au prochain redémarrage du serveur. N'oubliez pas qu'après avoir modifié votre mot de passe root, vous n'avez pas à le re entrer jusqu'à ce que vous exécutiez la commande FLUSH PRIVILEGES car le serveur n'a pas encore noté que vous l'aviez modifié !
  • Si les droits semblent changer durant une session, c'est peut être qu'un super utilisateur les a changé. Recharger les droits affecte non seulement les nouvelles connexions, mais aussi les connexions en cours, comme précisé dans section 6.9 Prise en compte des modifications de droits.
  • A fin de tests, démarrez le serveur mysqld avec l'option --skip-grant-tables. Ensuite, vous pouvez changer les tables de droits MySQL et utiliser le script mysqlaccess pour vérifier si les modifications ont bien l'effet désiré. Lorsque vous avez fini, lancez la commande flush-privileges pour forcer l'utilisation des nouvelles tables de droits. Note: Recharger les tables annule l'option --skip-grant-tables. Cela vous permet de dire au serveur quand commencer à utiliser les droits, sans le redémarrer.
  • Si vous avez des problèmes d'accès avec un programme Perl, Python ou ODBC, essayez de vous connecter au serveur avec mysql -u user_name nom_base_de_donnees ou mysql -u user_name -pyour_pass nom_base_de_donnees. Si vous etes capable de vous connecter avec le client mysql, c'est qu'il y a un problème avec votre programme, et non pas dans les droits d'accès.. (Notez aussi qu'il n'y a pas d'espace entre l'option -p et le mot de passe. Alternativement, vous pouvez utiliser --password=your_pass pour spécifier votre mot de passe.)
  • Si vous êtes bloqué par votre mot de passe, pensez à utiliser la fonction PASSWORD() pour changer de mot de passe avec les commandes INSERT, UPDATE ou SET PASSWORD. Cette fonction n'est pas nécessaire avec la commande GRANT ... INDENTIFIED BY ou avec la syntaxe mysqladmin password. Reportez vous à la section Passwords
  • localhost est un synonyme qui désigne votre machine locale, ou l'hôte de connexion par défaut. Cependant, les connexions à localhost ne sont pas valables si vous utilisez MIT-pthreads (Les connexions localhost utilisent les sockets Unix, qui ne sont pas supportées par MIT-pthreads). Pour contourner le problème sur ces systèmes, il préférable d'utiliser l'option --host pour spécifier explicitement le nom de l'hôte. Cela va forcer le type de la connexion à TCP/IP. Dans ce cas, vous devez utiliser le vrai nom d'hôte de votre machine, et l'inscrire dans la table user (Cela reste vrai même si vous exécutez un programme client sur la même machine que le serveur).
  • Si vous avez l'erreur Access denied lors d'une connexion au serveur avec l'option -u user_name nom_base_de_donnees, vous pouvez avoir un problème avec la talbe user. Vérifiez ceci en exécutant la commande mysql -u root mysql puis la commande sui vante :
mysql> SELECT * FROM user;

Le résultat devrait contenir une ligne dont les colonnes Host et User correspondent au nom d'hôte de votre ordinateur et au nom d'utilisateur MySQL.

  • Le message Access denied apparaîtra si vous essayez de vous connecter, le message d'erreur affichera l'adresse de l'hôte de connexion, le nom d'utilisateur et si vous utilisez un mot de passe. Normalement, il ne devrait y avoir qu'une ligne de la user qui corresponde exactement au nom d'hôte de votre ordinateur et au nom d'utilisateur
  • Si vous obtenez l'erreur ci dessous lors de la connexion au serveur depuis une autre machine que celle qui heberge le serveur MySQL, c'est qu'il manque une ligne dans la table user pour décrire votre machine hôte :
Host ... is not allowed to connect to this MySQL server

Vous pouvez régler ce problème en utilisant l'utilitaire mysql (sur la machine server ! !) pour ajouter une ligne dans la table user pour le nom d'hôte de votre ordinateur et le nom d'utilisateur. Si vous ne fonctionnez pas sous MySQL 3.22 et que vous ne savez pas quelle adresse IP ou quel nom d'hôte est celui de votre machine, il vaut mieux ajouter une ligne avec '%' dans la colonne Host et redémarrer le serveur avec l'option --log option. Après avoir tenté de vous connecter depuis la machine client, l'historique vous indiquera qui s'est réellement connecté. Vous pouvez alors remplacer la ligne avec '%' de la table user par une ligne plus spécifique. Sinon, cela peut créer un trou de sécurité.

  • Si le test avec mysql -u root test fonctionne mais que mysql -h your_hostname -u root test retourne une erreur Access denied, alors c'est que vous n'avez pas entrer le nom de votre hôte dans la table user. Un problème récurent est que la colonne Host de la table user contient un nom d'hôte général, mais la résolution de nom retourne un nom de domaine complet, et vice-versa. Par exemple, si vous avec une ligne qui contient 'tcx' dans la table user, mais que votre DNS dit à MySQL que votre nom d'hôte est 'tcx.subnet.se', la ligne ne correspondra pas. Essayez d'ajouter une ligne dans la table user qui contienne l'adresse IP numérique de votre hôte, dans la colonne Host. (Alternativement vous pouvez aussi ajouter une ligne dans la table user avec une valeur dans la colonne Host qui contienne un caractère joker (par exemple, 'tcx.%'). Cependant, c'est une pratique non sécurisée, qui peut provoquer des problèmes de sécurité.
  • Si mysql -u user_name test fonctionne mais mysql -u user_name other_nom_base_de_donnees ne fonctionne pas, c'est que vous n'avez pas d'entrée pour la colonne other_nom_base_de_donnees de la table db.
  • Si mysql -u user_name nom_base_de_donnees fonctionne lorsqui'il est exécuté sur la machine server, mais que mysql -u host_name -u user_name nom_base_de_donnees ne fonctionne pas lorsqu'il est utilisé sur une machine client, c'est que la machine client n'est pas listée dans la table user ou la table db.
  • Si vous n'arrivez pas à vous defaire de l'erreur Access denied, effacez toutes les lignes de la table user qui possède un joker (``%'' ou ``_')'dans la colonne Host. Une erreur récurrente est d'insérer une ligne du type Host='%' et User='quidam', en pensant que cela va vous permettre de vous connecter depuis la machine localhost. La raison qui fait que ceci ne fonctionne pas est que les droits par défaut contiennent une ligne qui est Host='localhost' et User=''. Or, la ligne qui a Host ='localhost' est plus spécifique que '%', et donc, sera utilisée de préférence à celle utilisée lors de la connexion de depuis localhost! La procedure correcte est d'insérer un deuxième ligne avec Host='localhost' et User='some_user', ou d'effacer les lignes avec Host='localhost' et User=''.
  • Si vous avez l'erreur suivante, c'est que vous avez un problème avec la table db ou host:
Access to database denied

Si l'entrée sélectionnée dans la table db a une colonne Host vide, assurezvous qu'il y a au moins une entrée correspondante dans la table host qyu spécifie à quel hôte s'applique ces droits. Si vous avez une erreur en utilisant la commande SELECT ... INTO OUTFILE or LOAD DATA INFILE, c'est que vous n'avez peut être pas les droits file.

  • Rappelez vous que les programmes clients utilisent des paramètres par défaut qui sont stockés dans des fichiers de configuration ou des variables d'environnement. Si un client semble ne pas envoyer les bons paramètres lorsque vous ne les spécifiez pas, allez vérifier les informations stockées dans le fichier ``.my.cnf'' de votre dossier racine, ou les variables d'environnment. Vous pouvez aussi vérifier les paramètres dans les fichiers de configuration de MySQL, mais il est très improbable que des paramètres de connexion soient enregistrés là. 4.15.4 Fichier d'options.
  • Si tout ce qui précède a échoué, lancez le démon mysqld avec les options de debugging (par exemple, --debug=d,general,query). Cette option affichera les hôtes et nom d'utilisateur des connexions, ainsi que des informations concernant les commandes exécutées. Reportez vous à la section G.1 Debugguer un serveur MySQL.
  • Si vous avez vraiment tout tenté, et que vous pensez qu'il vous faut le rapporter à la liste de diffusion (en anglais), n'oubliez jamais de fournir un dump des tables de droits de MySQL. Vous pouvez créer ce dump avec l'utilitaire mysqldump mysql. Comme toujours, pensez à poster votre problème avec l'utilitaire mysqlbug. Dans certains cas, vous devrez redémarrer mysqld avec l'option --skip-grant-tables pour pouvoir faire le dump.