Si vous rencontrez des erreurs Access denied
quand vous essayez de vous connecter au serveur MySQL, la liste
suivante indique quelques actions à entreprendre pour corriger
le problème :
Assurez vous que le serveur fonctionne. S'il ne fonctionne pas, vous ne pourrez pas vous y connecter. Par exemple, si vous tentez de vous connecter au serveur, et que vous recevez un message comme celui-ci, c'est peut-être que le serveur ne fonctionne pas :
shell>mysql
ERROR 2003: Can't connect to MySQL server on 'host_name' (111) shell>mysql
ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
Il se peut aussi que le serveur fonctionne, mais que vous
essayez de vous connecter en utilisant un port TCP/IP, un
pipe nommé ou un fichier de socket Unix qui n'est pas celui
que le serveur utilise. Pour corriger cela, lorsque vous
utilisez un client, spécifiez l'option
--port
pour indiquer le bon port, et
l'option --socket
pour indiquer le bon
fichier de socket Unix ou le pipe nommé Windows. Pour
connaître le port utilisé, et le chemin jusqu'à la
socket, vous pouvez utiliser cette commande :
shell> netstat -l | grep mysql
Les tables de droits doivent être correctement configurée
pour que le serveur les utilise lors de l'identification.
Les installations Windows qui utilisent une distribution
binaire ou les installations binaires Unix
RPM
initialisent automatiquement la base
mysql
contenant les tables de droits.
Pour les autres types d'installation, vous devez initialiser
les tables de droits manuellement, avec le script
mysql_install_db
. Pour plus de détails,
voyez Section 2.5.2, « Procédures de post-installation sous Unix ».
Un moyen de déterminer si vous avez besoin d'initialiser
les tables de droits est de regarder dans le dossier
mysql
dans le dossier de données. Le
dossier de données s'appelle data
ou
var
et est situé dans le dossier
d'installation de MySQL. Assurez vous que vous avez un
fichier appelé user.MYD
dans le
dossier mysql
. Si vous ne le trouvez
pas, exécutez le script
mysql_install_db
. Après exécution de ce
script, et redémarrage du serveur, testez les premiers
droits avec la commande :
shell> mysql -u root test
Le serveur doit vous laisser vous connecter sans erreur.
Après une installation toute fraîche, vous devez vous connecter au serveur et créer les utilisateurs en réglant leurs permissions d'accès :
shell> mysql -u root mysql
Le serveur devrait vous laisser vous connecter car
l'utilisateur root
de MySQL n'a pas de
mot de passe initial. Ceci est aussi une faille de
sécurité, et donc, vous devez choisir un mot de passe pour
l'utilisateur root
en même tant que les
autres utilisateurs MySQL. Pour des instructions sur la
configuration des mots de passe initiaux, voyez la section
Section 2.5.3, « Création des premiers droits MySQL ».
Si vous avez mis à jour une version de MySQL avec une
nouvelle versions, avez-vous utilisé le script
mysql_fix_privilege_tables
? Si ce n'est
pas le cas, faîtes-le. La structure des tables de droits
change occasionnellement, lorsque de nouvelles
fonctionnalités sont ajoutées : après une mise à jour,
assurez-vous que vos tables ont la bonne structure. Pour des
instructions, voyez
Section 2.6.7, « Mise à jour des tables de droits ».
Si un programme client re¸oit l'erreur suivante lorsqu'il essaie de se connecter, cela signifie que le serveur attend un mot de passe dans un nouveau format, alors que le client fournit un ancien format :
shell> mysql
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
Pour des informations sur comment traiter ce type de
situations, voyez Section 5.5.9, « Hashage de mots de passe en MySQL 4.1 » et
Section A.2.3, « Erreur Client does not support authentication
protocol
».
Si vous essayez de vous connecter en tant que
root
et que vous recevez l'erreur
suivante, cela signifie que vous n'avez pas d'entrée dans
la table user
avec une valeur
'root'
dans la colonne
User
et que mysqld
ne
peut pas résoudre le nom d'hôte du client :
Access denied for user: ''@'unknown' to database mysql
Dans ce cas, vous devez relancer le serveur avec l'option
--skip-grant-tables
, et éditer votre
fichier /etc/hosts
ou
\windows\hosts
pour ajouter une ligne
vous votre hôte.
N'oubliez pas que les clients utilisent les paramètres de
connexions placés dans les fichiers d'options ou les
variables d'environnement. Si un client semble envoyer des
paramètres de connexions invalides, lorsque vous n'en
spécifiez aucun, vérifiez votre environnement, et les
options appropriées. Par exemple, si vous recevez l'erreur
Access denied
avec un client utilisé
sans option, assurez vous que vous n'avez pas spécifié un
ancien mot de passe dans vos anciens fichiers d'options.
Vous pouvez supprimer l'utilisation des fichiers d'options
d'un client en utilisant l'option
--no-defaults
. Par exemple :
shell> mysqladmin --no-defaults -u root version
Le fichier d'option que les clients utilisent sont listés
dans la section Section 4.3.2, « Fichier d'options my.cnf
». Les
variables d'environnement sont listées dans
Annexe E, Variables d'environnement.
Si vous obtenez une erreur qui ressemble à celle-ci :
shell> mysqladmin -u root -pxxxx ver
Access denied for user: 'root'@'localhost' (Using password: YES)
Cela signifie que vous utilisez un mot de passe erroné.
Si l'erreur précédente survient lorsque vous n'avez pas
spécifié de mot de passe, cela signifie que vous n'avez
pas spécifié de mot de passe dans un fichier d'options.
Essayez l'option --no-defaults
telle
décrit ci-dessus.
Pour des informations sur les changements de mot de passe, voyez Section 5.6.5, « Configurer les mots de passe ».
Si vous avez oublié le mot de passe root, vous pouvez
redémarrer mysqld
avec
--skip-grant-tables
pour changer le mot de
passe. See Section A.4.1, « Comment réinitialiser un mot de passe Root oublié ».
Si vous n'arrivez pas à faire fonctionner votre mot de
passe, souvenez-vous que vous devez utiliser la fonction
PASSWORD()
si vous le changez avec les
commandes INSERT
,
UPDATE
, ou SET
PASSWORD
. L'utilisation de la fonction
PASSWORD()
n'est pas nécessaire si vous
spécifiez le mot de passe en utilisant la commande
GRANT ... INDENTIFIED BY
ou la commande
mysqladmin password
. See
Section 5.6.5, « Configurer les mots de passe ».
mysql> SET PASSWORD FOR 'abe'@'host_name' = 'eagle';
A la place, utilisez cette commande :
mysql> SET PASSWORD FOR 'abe'@'host_name' = PASSWORD('eagle');
La fonction PASSWORD()
n'est pas
nécessaire si vous spécifiez un mot de passe avec la
commande GRANT
ou la commande en ligne
mysqladmin password
, qui utilisent
automatiquement PASSWORD()
pour chiffrer
le mot de passe.
localhost
est un synonyme de votre nom
d'hôte local, et est aussi l'hôte par défaut auquel le
client essaye de se connecter si vous n'en spécifiez pas un
explicitement. Toutefois, les connexions à
localhost
ne fonctionnent pas si vous
utilisez une version antérieure à la 3.23.27 qui utilise
les MIT-pthreads
.
Pour contourner ce problème sur de tels systèmes, vous
devez utiliser l'option --host
pour nommer
l'hôte du serveur explicitement. Cela créera une connexion
TCP/IP vers le serveur mysqld
. Dans ce
cas, vous devez avoir votre vrai nom d'hôte dans les
entrées de la table user
du serveur
hôte. (Cela est vrai même si vous utilisez un programme
client sur la même machine que le serveur.)
Si vous obtenez une erreur Access denied
lorsque vous essayez de vous connecter à la base de
données avec mysql -u nom_utilisateur
nom_base
, vous pouvez avoir un problème dans la
table user
. Vérifiez le en vous
exécutant mysql -u root mysql
et entrant
la commande SQL suivante :
mysql> SELECT * FROM user;
Le résultat devrait comprendre une entrée avec les
colonnes Host
et User
correspondante au nom d'hôte de votre ordinateur et votre
nom d'utilisateur MySQL.
Le message d'erreur Access denied
vous
dira en tant que qui vous essayez de vous identifier,
l'hôte à partir duquel vous voulez le faire, et si vous
utilisez ou pas un mot de passe. Normalement, vous devez
avoir une entrée dans la table user
qui
correspondent au nom d'hôte et nom d'utilisateur donnés
dans le message d'erreur. Par exemple, si vous obtenez une
erreur qui contient Using password: NO
,
cela signifie que vous avez essayé de vous connecter sans
mot de passe.
Si vous obtenez l'erreur suivante en essayant de vous
connecter à partir d'un hôte différent de celui sur
lequel est placé le serveur, c'est qu'il n'y a pas
d'enregistrement dans la table user
qui
correspond à cet hôte :
Host ... is not allowed to connect to this MySQL server
Vous pouvez corriger ce problème en configurant un compte avec la combinaison hôte / nom d'utilisateur que vous utilisez lors de la connexion.
Si vous ne connaissez ni l'IP ni le nom d'hôte à partir
duquel vous essayez de vous connecter, vous devez créer une
entrée avec '%'
dans la colonne
Host
dans la table
user
et redémarrer
mysqld
avec l'option
--log
sur la machine serveur. Après avoir
essayé à nouveau de vous connecter à partir de la machine
cliente, les informations contenues dans le log de MySQL
vous apprendront comment vous vous êtes vraiment
connectés. (Remplacez alors l'entrée de la table
user
contenant '%'
avec le nom d'hôte qui apparaît dans le log. Sinon, vous
aurez un système non-sécurisé.)
Une autre raison pour cette erreur sous Linux est que vous
utilisez une version binaire de MySQL qui est compilée avec
une version de glibc
différente de celle
que vous utilisez. Dans ce cas, vous devez soit mettre à
jour votre système d'exploitation et sa bibliothèque
glibc
, soit télécharger les sources de
MySQL et les compiler vous-même. Un RPM
de sources est normalement facile à compiler et installer,
cela ne devrait donc pas vous poser de gros problèmes.
Si vous obtenez une erreur où le nom d'hôte est absent ou que celui-ci est une adresse IP alors que vous avez bien entré le nom d'hôte :
shell> mysqladmin -u root -pxxxx -h some-hostname ver
Access denied for user: 'root@' (Using password: YES)
Cela signifie que MySQL a rencontré des erreurs lors de la
résolution de l'IP du nom d'hôte. Dans ce cas, vous pouvez
exécuter mysqladmin flush-hosts
pour
vider le cache interne des DNS. See Section 7.5.6, « Comment MySQL utilise le DNS ».
Les autres solutions sont :
Essayez de trouver le problème avec votre serveur DNS et corrigez le.
Spécifiez les IP à la place des noms d'hôtes dans les tables de droits de MySQL.
Ajoutez une ligne pour le nom de votre machine dans
/etc/hosts
.
Démarrez mysqld
avec
--skip-name-resolve
.
Démarrez mysqld
avec
--skip-host-cache
.
Sous Unix, si vous utilisez le serveur et le client sur
la même machine, connectez vous à
localhost
. Les connexions Unix à
localhost
utilisent une socket Unix
plutôt que TCP/IP.
Sous Windows, si vous exécutez le serveur et le client
sur la même machine, et que le serveur supporte les
pipes nommés, connectez vous à l'hôte
.
(point). Les connexions à
.
utilisent les pipes nommés plutôt
que TCP/IP.
Si mysql -u root test
fonctionne mais que
mysql -h votre_hote -u root test
provoque
une erreur Access denied
, il se peut que
vous ayez entré de mauvaises informations pour votre nom
d'hôte dans la table user
. Un problème
commun ici est que la valeur Host
dans la
table user
spécifie un nom d'hôte
non-qualifié, mais que vos routines système de résolution
de noms retournent un nom de domaine pleinement qualifié
(ou vice-versa). Par exemple, si vous avez une entrée avec
l'hôte 'tcx'
dans la table
user
, mais que vos DNS disent à MySQL
que votre nom d'hôte est
'tcx.subnet.se'
, l'entrée ne
fonctionnera pas. Essayez d'ajouter une entrée dans la
table user
qui contient votre adresse IP
en tant que valeur de la colonne Host
.
(Une alternative est d'ajouter une entrée dans la table
user
avec une valeur de
Host
qui contient un caractère spécial,
par exemple, 'tcx.%'
. Toutefois,
l'utilisation des noms d'hôtes se terminant par
‘%
’ est
non-sécurisé et n'est
pas recommandé !)
Si mysql -u utilisateur test
fonctionne
mais que mysql -u utilisateur autre_base
ne fonctionne pas, vous n'avez pas d'entrée pour
autre_base
listée dans la table
db
.
Si mysql -u utilisateur nom_base
fonctionne à partir du serveur, mais que mysql -h
nom_hote -u utilisateur nom_base
ne fonctionne pas
à partir d'une autre machine, cette machine n'est pas
listée dans la table user
ou
db
.
Si vous n'arrivez pas à trouver pourquoi vous obtenez
l'erreur Access denied
, effacez toutes
les entrées de la table user
dont la
valeur du champ Host
contiennent des
caractères spéciaux (entrées contenant
‘%
’ ou
‘_
’). Une erreur commune est
d'insérer une nouvelle entrée avec
Host
='%'
et
User
='un utilisateur'
,
en pensant que cela vous permettra de spécifier
localhost
pour vous connecter à partir
de la même machine. La raison pour laquelle cela ne
fonctionnera pas est que les droits par défaut incluent une
entrée avec
Host
='localhost'
et
User
=''
. Puisque cette
entrée possède une valeur de Host
égale à 'localhost'
, qui est plus
spécifique que '%'
, elle est utilisée
de préférence à la nouvelle entrée lors de la connexion
à partir de localhost
! La procédure
correcte est d'insérer une seconde entrée avec
Host
='localhost'
et
User
='un_utilisateur'
,
ou de supprimer l'entrée avec
Host
='localhost'
et
User
=''
.
Si vous avez l'erreur suivante, vous avez peut-être un
problème avec la table db
ou
host
:
Access to database denied
Si l'entrée sélectionnée dans la table
db
possède un champ
Host
vide, assurez-vous qu'il y a au
moins une entrée correspondante dans la table
host
spécifiant les hôtes auxquels
l'entrée dans la table db
s'applique.
Si vous obtenez l'erreur lors de l'utilisation des commandes
SQL SELECT ... INTO OUTFILE
ou
LOAD DATA INFILE
, votre entrée dans la
table user
ne possède probablement pas
les droits de FILE
.
Si vous apportez des modifications aux tables de droits
directement (en utilisant une requête
INSERT
ou UPDATE
) et
que vos changements semblent ignorés, souvenez vous que
vous devez exécuter une requête FLUSH
PRIVILEGES
ou la commande mysqladmin
flush-privileges
pour demander au serveur de lire
à nouveau les tables de droits. Sinon, vos changements ne
seront pris en compte qu'au prochain démarrage du serveur.
Souvenez-vous qu'après avoir choisi le mot de passe
root
avec une commande
UPDATE
, vous n'aurez pas à le spécifier
avant de recharger les privilèges, car le serveur ne sait
pas que vous l'avez modifié !
Si vos droits changent en milieu de session, c'est peut être qu'un administrateur MySQL a changé les droits. En rechargeant les tables de droits, il a modifié aussi les connexions existantes, comme indiqué dans Section 5.5.7, « Quand les modifications de privilèges prennent-ils effets ? ».
Si vous avez des problèmes d'accès avec un programme Perl,
PHP, Python, ou ODBC, essayez de vous connecter au serveur
avec mysql -u utilisateur nom_base
ou
mysql -u utilisateur -pvotre_passe
nom_base
. Si vous pouvez vous connecter en
utilisant le client mysql
, c'est que le
problème vient de votre programme et non des droits MySQL.
(Notez qu'il n'y a pas d'espace entre -p
et le mot de passe; vous pouvez aussi utiliser la syntaxe
--password=votre_passe
pour spécifier le
mot de passe. Si vous utilisez l'option
-p
toute seule, MySQL vous demandera le
mot de passe.)
Pour les tests, démarrez le démon
mysqld
avec l'option
--skip-grant-tables
. Vous pourrez alors
changer les tables de droits MySQL puis utiliser le script
mysqlaccess
pour vérifier si vos
changements ont l'effet désiré. Lorsque vous êtes
satisfait de vos modifications, exécutez
mysqladmin flush-privileges
pour dire au
serveur mysqld
de commencer à utiliser
les nouvelles tables de droits. Recharger les tables de
droits écrase l'option
--skip-grant-tables
. Cela vous permet de
dire au serveur de commencer à prendre en considération
les droits sans avoir à le couper et le redémarrer.
Si rien ne fonctionne, démarrez le démon
mysqld
avec l'option de débogage (par
exemple, --debug=d,general,query
). Cela
affichera l'hôte et les informations de l'utilisateur pour
chaque tentative de connexion. Les informations à propos de
chaque commande exécutée seront aussi affichées. See
Section D.1.2, « Créer un fichier de tra¸age ».
Si vous avez d'autres problèmes avec les tables de droits
de MySQL et que vous sentez que vous devez envoyer le
problème à la liste de diffusion, fournissez toujours le
contenu de vos tables de droits. Vous pouvez obtenir les
données avec la commande mysqldump
mysql
. Comme toujours, postez votre problème à
l'aide du script mysqlbug
. See
Section 1.4.1.3, « Comment rapporter un bogue ou un problème ». Dans certains cas, vous aurez
besoin de redémarrer mysqld
avec
--skip-grant-tables
pour pouvoir exécuter
mysqldump
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.