La connexion MySQL ne fonctionne pas: 2002 Aucun fichier ou répertoire de ce type

106

J'essaye de configurer WordPress. J'ai Apache et MySQL en cours d'exécution, et les comptes et la base de données sont tous configurés. J'ai essayé de faire une connexion simple:

<?php
    $conn = mysql_connect('localhost', 'USER', 'PASSWORD');
    if(!$conn) {
        echo 'Error: ' . mysql_errno() . ' - ' . mysql_error();
    }
?>

Et je comprends toujours ceci:

Erreur: 2002 - Aucun fichier ou répertoire de ce type

De quel fichier ou répertoire pourrait-il parler?

Je suis sur un OS X Snow Leopard, en utilisant l'Apache intégré. J'ai installé MySQL en utilisant le dmg x86_64.

MISE À JOUR: J'ai trouvé que le socket est à /tmp/mysql.sock, donc dans php.ini, j'ai remplacé toutes les occurrences du mauvais chemin par cela.

mk12
la source
2
veuillez coller la sortie de /etc/init.d/mysql startsi vous êtes sur une distribution de base Debian. en cas d'échec, vérifiez le /etc/my.cnffichier pour le chemin du fichier de socket mysql correct.
sepehr
4
résolu le même problème sur OS X avec XAMPP en utilisant "127.0.0.1" à la place de "localhost".
Giuseppe Urso

Réponses:

97

Si vous utilisez Linux: le chemin d'accès au fichier mysql.sock est incorrect. C'est généralement parce que vous utilisez (LAMPP) XAMPP et ce n'est pas dans /tmp/mysql.sock

Ouvrez le fichier php.ini et recherchez cette ligne:

mysql.default_socket

Et fais-le

mysql.default_socket = /path/to/mysql.sock
Gorges d'Alec
la source
5
si vous n'êtes pas sûr, essayez /var/lib/mysql/mysql.sock comme nouveau chemin vers le socket.
Jay
1
Hmm. Peut-être qu'ils voulaient dire Léopard ou Tigre. Dans tous les cas, amusez-vous avec WordPress!
Alec Gorge
3
Notez que vous devrez peut-être définir mysqli.default_socket = /path/to/mysql.sock si vous vous connectez avec mysqli
razzed
2
L'emplacement de socket par défaut pour une installation MySQL standard est /tmp/mysql.sock.
Jonathon Hill
4
"Le nom d'hôte localhost a une signification particulière. Il est lié à l'utilisation de sockets de domaine Unix. Il n'est pas possible d'ouvrir une connexion TCP / IP en utilisant le nom d'hôte localhost, vous devez utiliser 127.0.0.1 à la place." - php.net/manual/en/mysqli.quickstart.connections.php . Donc, fondamentalement, quelque chose ne fonctionne pas avec la connexion aux sockets du domaine Unix qui permettent localhostde fonctionner et TCP / IP fonctionne donc le changer en adresse TCP / IP 127.0.0.1fonctionnera.
Edward
154

J'ai eu un problème similaire et j'ai pu le résoudre en adressant mon mysql avec 127.0.0.1au lieu de localhost.

Cela signifie probablement que j'ai quelque chose qui ne va pas dans la configuration de mes hôtes, mais cette solution rapide me permet de continuer.

Bryan Kennedy
la source
2
vous venez de me faire gagner un temps précieux.
uchamp
2
J'ai vérifié mon fichier hosts et j'ai trouvé une ligne avec code127.0.0.1 localhost code. Ce qui me rend curieux de savoir pourquoi la connexion via localhost n'a pas fonctionné. Si quelqu'un pouvait m'éclairer, je serais heureux.
ola
2
C'est parce que le mysql.default_socket dans php.ini est faux. Exécutez "php -i | grep mysql.default_socket"
Jonah
1
Cela a fonctionné pour moi, je suis sur el Capitan avec mysql 5.7 installé via homebrew. J'essayais une installation WP et quand j'ai changé "localhost" en "127.0.0.1", il a pu se connecter.
dgig
5
"Le nom d'hôte localhost a une signification particulière. Il est lié à l'utilisation de sockets de domaine Unix. Il n'est pas possible d'ouvrir une connexion TCP / IP en utilisant le nom d'hôte localhost, vous devez utiliser 127.0.0.1 à la place." - php.net/manual/en/mysqli.quickstart.connections.php . Donc, fondamentalement, quelque chose ne fonctionne pas avec la connexion aux sockets du domaine Unix qui permettent localhostde fonctionner et TCP / IP fonctionne donc le changer en adresse TCP / IP 127.0.0.1fonctionnera.
Edward
39

Ceci est pour Mac OS X avec l' installation native d'Apache HTTP et l' installation personnalisée de MySQL .

La réponse est basée sur l'excellente réponse de @ alec-gorge, mais comme j'ai dû rechercher sur Google des modifications spécifiques pour la configurer dans ma configuration, principalement spécifique à Mac OS X, j'ai pensé l'ajouter ici par souci d'exhaustivité.

Activer la prise en charge de PHP5 pour Apache HTTP

Assurez-vous que le support PHP5 est activé dans /etc/apache2/httpd.conf.

Modifiez le fichier avec sudo vi /etc/apache2/httpd.conf(entrez le mot de passe lorsque vous y êtes invité) et décommentez (supprimez ;du début de) la ligne pour charger le module php5_module .

LoadModule php5_module libexec/apache2/libphp5.so

Démarrez Apache HTTP avec sudo apachectl start(ou restarts'il est déjà démarré et doit être redémarré pour relire le fichier de configuration).

Assurez-vous que /var/log/apache2/error_logcontient une ligne qui vous indique que le php5_module est activé - vous devriez voir PHP/5.3.15(ou similaire).

[notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations

Recherche du nom du fichier Socket

Lorsque MySQL est opérationnel (avec ./bin/mysqld_safe), des lignes de débogage doivent être imprimées sur la console qui vous indiquent où vous pouvez trouver les fichiers journaux. Notez le nom d'hôte dans le nom de fichier - localhostdans mon cas - qui peut être différent pour votre configuration.

Le fichier qui vient après Logging toest important. C'est là que MySQL enregistre son travail.

130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'.
130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data

Ouvrez le localhost.errfichier (encore une fois, le vôtre peut être nommé différemment), c'est- tail -1 /Users/jacek/apps/mysql/data/localhost.errà- dire pour connaître le nom du fichier socket - ce devrait être la dernière ligne.

$ tail -1 /Users/jacek/apps/mysql/data/localhost.err
Version: '5.5.27'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

Notez la socket:partie - c'est le fichier socket que vous devez utiliser php.ini.

Il existe un autre moyen (certains disent un moyen plus simple) de déterminer l'emplacement du nom de fichier du socket en se connectant à MySQL et en exécutant:

show variables like '%socket%';

Configurer PHP5 avec le support MySQL - /etc/php.ini

En parlant de php.ini ...

Dans le /etcrépertoire, il y a le fichier /etc/php.ini.default . Copiez-le dans /etc/php.ini .

sudo cp /etc/php.ini.default /etc/php.ini

Ouvrez /etc/php.iniet recherchez mysql.default_socket .

sudo vi /etc/php.ini

La valeur par défaut mysql.default_socketest /var/mysql/mysql.sock. Vous devriez le changer pour la valeur que vous avez notée précédemment - c'était /tmp/mysql.sockdans mon cas.

Remplacez le /etc/php.inifichier pour refléter le nom du fichier socket:

mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock

Vérification finale

Redémarrez Apache HTTP.

sudo apachectl restart 

Vérifiez les journaux s'il n'y a pas d'erreur liée à PHP5. Aucune erreur signifie que vous avez terminé et PHP5 avec MySQL devrait fonctionner correctement. Félicitations!

Jacek Laskowski
la source
Cette réponse aide
Vigneshwaran
Cette réponse est de la merde. Cela n'a rien à voir avec la question posée et n'est fondamentalement qu'un tutoriel d'ampli (acos), qui - s'il est bon - est encore plus gaspillé s'il est placé ici et non à un endroit où les gens qui recherchent réellement la configuration d'une pile d'amplis sur macos recherchent. En ce qui concerne la question posée: cette réponse n'explique pas pourquoi l'erreur se produit et pourquoi php essaie de se connecter via le socket au lieu du nom d'hôte à la place, bien que cela soit passé à mysql_connect, qui est le problème réel de la question d'origine et non un générique idée fausse de l'installation de logiciels.
ohcibi
@ohcibi J'ai écrit "Je pensais l'ajouter ici par souci d'exhaustivité." et j'ai pensé que ce serait suffisant (et compte tenu des votes positifs, quelques personnes l'ont aimé). J'aime votre idée de rendre la réponse plus facile à trouver, mais je ne sais pas comment. Pourriez-vous partager vos pensées et m'aider ... à nouveau? Merci!
Jacek Laskowski
@JacekLaskowski en général: rédigez un article de blog et commentez un lien vers celui-ci vers la réponse acceptée / la plus votée avec la même intention que vous avez eue ici ("ajoutez-le par souci d'exhaustivité"). Mais dans ce fil même, je ne vois même pas de raison de publier ce lien. L'OP a déclaré qu'il utilisait macOS, mais ce problème n'a rien à voir avec un système d'exploitation, mais avec la manière d'interpréter mySQL localhost. Personne à la recherche d'aide sur la configuration de xamp sur macos arrivera ici en recherchant sur Google. C'est pourquoi j'ai utilisé le terme «merde». Ce fil n'a rien à voir avec macos mais avec mysql uniquement (pas même php).
ohcibi
14

Le remplacement de 'localhost' par '127.0.0.1' dans le fichier de configuration (connexion à la base de données) a aidé!

Oleg
la source
1
mais pourquoi devrait-il être aidé?
Enamul Hassan
"Remplacement de 'localhost' par '127.0.0.1'" ou 127.0.0.1 par l'adresse actuelle du serveur MySQL, c'est-à-dire u55151.mysql.someserver.eu.
user2812532
13

Le redémarrage du serveur mysql peut aider. Dans mon cas, le redémarrage du serveur a permis de gagner beaucoup de temps.

service mysql restart

PS - utilisation sudo service mysql restartpour un utilisateur non root.

Avani Khabiya
la source
2
C'est tellement génial quand la solution simple fonctionne réellement.
abalter
10

Tout d'abord, assurez-vous que MySQL est en cours d'exécution. Commande: mysqld start

Si vous ne parvenez toujours pas à vous connecter, à quoi ressemble votre /etc/my.cnf? (ou /etc/msyql/my.cnf)

Les 2 autres messages sont corrects dans la mesure où vous devez vérifier votre socket car 2002 est une erreur de socket.

Un excellent tutoriel sur la configuration de LAMP est: http://library.linode.com/lamp-guides/centos-5.3/index-print

Todd Moses
la source
Le programme d'installation n'a pas mis de fichier my.cnf, mais il existe un fichier /usr/local/mysql/mysql-test/include/default_my.cnf, dois-je le copier en tant que my.cnf /etc?
mk12
oui, mais vous constaterez peut-être que vous devez le modifier un peu plus tard.
Todd Moses
7

Non pas que cela vous aide beaucoup, mais dans les versions récentes (et encore moins récentes ) de MySQL, le code d’erreur 2002 signifie «Impossible de se connecter au serveur MySQL local via socket [nom-de-socket]», donc cela pourrait vous dire un peu plus.

Arthur Reutenauer
la source
1
Sur OSX 10.9.x avec MySQL 5.5.38 installé à partir de la source, j'obtenais cette erreur. Cette astuce était correcte: c'était un problème de socket même si mysqli_connect_errno () et mysqli_connect_error ()) indiquaient le message 2002 file not found. J'ai pu résoudre cela en éditant mon /etc/php.ini et en définissant mysql.default_socket ET mysqli.default_socket pour corriger la valeur de socket (puisque mon application utilisait mysqli pour les connexions)
Ronnie
7

En développant la réponse de Matthias D ici, j'ai pu résoudre cette erreur de 2002 sur MySQL et MariaDB avec des chemins exacts en utilisant ces commandes:

Commencez par obtenir le chemin réel vers le socket MySQL:

netstat -ln | grep -o -m 1 '/.*mysql.sock'

Ensuite, récupérez le chemin PHP :

php -r 'echo ini_get("mysql.default_socket") . "\n";'

En utilisant la sortie de ces deux commandes , liez-les:

sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock

Si cela revient, il No such file or directoryvous suffit de créer le chemin vers le PHP mysql.sock, par exemple si votre chemin était, /var/mysql/mysql.sockvous exécuteriez:

sudo mkdir -p /var/mysql

Puis réessayez la commande sudo ln .

mattbell87
la source
6

Je vérifierais votre fichier php.ini et vérifierais que mysql.default_socket est correctement défini et également que votre mysqld est correctement configuré avec un fichier socket auquel il peut accéder. La valeur par défaut typique est "/tmp/mysql.sock".

Myles
la source
Ok, ça dit /var/mysql/mysql.sock, mais ce chemin n'existe pas.
mk12
6

J'ai rencontré ce problème aussi, puis j'ai modifié «localhost» en «127.0.0.1», cela fonctionne.

JackSun
la source
6

dans mon cas, j'ai un problème avec mysqli_connect.
quand je veux me connecter
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () me renvoyer cette erreur "Aucun fichier ou répertoire de ce type"

cela a fonctionné pour moi mysqli_connect('localhost:3306', 'myuser','mypassword')

masoud2011
la source
Cela a bien fonctionné pour moi; c'était le changement dont j'avais besoin pour charger le package de statistiques de football américain d'Armchair Analysis dans une installation Mysql locale OS X. Merci!
Michael Scott Cuthbert
heureux d'entendre ça :)
masoud2011
4

L'erreur 2002 signifie que MySQL ne peut pas se connecter au serveur de base de données local via le fichier socket (par exemple /tmp/mysql.sock).

Pour savoir où se trouve votre fichier socket, exécutez:

mysql_config --socket

vérifiez ensuite que votre application utilise le bon fichier de socket Unix ou connectez-vous via le port TCP / IP à la place.

Vérifiez ensuite si votre PHP a la bonne configuration de socket MySQL:

php -i | grep mysql.default_socket

et assurez-vous que ce fichier existe .

Testez la prise:

mysql --socket=/var/mysql/mysql.sock

Si la socket Unix est erronée ou n'existe pas, vous pouvez la créer un lien symbolique, par exemple:

ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

ou corrigez votre fichier de configuration (par exemple php.ini).

Pour tester la connexion PDO directement depuis PHP, vous pouvez exécuter:

php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"

Vérifiez également la configuration entre Apache et CLI (interface de ligne de commande), car la configuration peut être différente.

Il se peut que le serveur soit en cours d'exécution, mais que vous essayez de vous connecter en utilisant un port TCP / IP, un tube nommé ou un fichier de socket Unix différent de celui sur lequel le serveur écoute. Pour corriger cela, vous devez appeler un programme client (par exemple en spécifiant une --portoption) pour indiquer le numéro de port approprié, ou le tube nommé ou le fichier socket Unix (par exemple, --socketoption).

Voir: Dépannage des problèmes de connexion à MySQL


Autres utils / commandes qui peuvent aider à suivre le problème:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Utilisez XDebug avec xdebug.show_exception_trace=1dans votrexdebug.ini
  • Sur OS X essayez sudo dtruss -fn mysqld, sur le débogage Linux avecstrace
  • Vérifiez les permissions sur le socket Unix: stat $(mysql_config --socket)et si vous avez suffisamment d'espace libre ( df -h).
  • Redémarrez votre MySQL.
  • Vérifiez net.core.somaxconn.
Kenorb
la source
3

Assurez-vous que votre serveur local (MAMP, XAMPP, WAMP, etc.) fonctionne.

Husain Al Faraj
la source
En plus de cela, si vous utilisez MAMP sur MacOS (évidemment!), Vous obtenez également cette erreur si vous accédez à votre site immédiatement après avoir réveillé votre Mac du sommeil. La solution, bien sûr, est simplement d'attendre et de réessayer. :-)
texelate
0

J'avais un problème similaire.
Fondamentalement, le problème est qu'il y a probablement deux instances de mysql en cours d'exécution.
A) Un fonctionnant sur /etc/init.d
B) Lampe en cours d'installation sur / opt / lamp
Solution:
Étape 1: - Trouvez toutes les instances en cours d'exécution de mysql en utilisant commnad "find / | grep mysqld"
Étape 2: - Arrêtez les services en cours d'exécution sur /etc/init.d en utilisant le service mysql stop
Étape 3: - Redémarrez vos services Lamp en utilisant / opt / lamp / lamp restart

Vous devriez être prêt à partir :)

Jignesh Rawal
la source
0

Sur un Mac, avant de faire tout le travail acharné, vérifiez simplement vos paramètres System Preferences > MySQL. Plus souvent qu'autrement, j'ai vu l'équipe rencontrer ce problème depuis The MySQL Server Instance is stopped.

Cliquez sur le Start MySQL Serverbouton et la magie se produira.

Steven Ventimiglia
la source
0

J'utilise PHP-FPM ou plusieurs versions de php sur mon serveur. Dans mon cas, je mets à jour la valeur de mysqli car il n'y a pas de paramètre de socket par défaut de mysql:

mysqli.default_socket

à :

mysql.default_socket = /path/to/mysql.sock

merci à @Alec Gorge

Navotera
la source
0

J'ai eu le même problème. Ma socket a finalement été trouvée dans /tmp/mysql.sock. Ensuite, j'ai ajouté ce chemin à php.ini. J'ai trouvé la prise là-bas en vérifiant la page "État du serveur" dans MySQL Workbench. Si votre socket n'est pas dans /tmp/mysql.sock alors peut-être que MySQL Workbench pourrait vous dire où il se trouve? (Certes, vous utilisez MySQL Workbench ...)

Fom
la source
0

J'ai installé MySQL à l'aide du programme d'installation. En fait, il n'y avait pas de répertoire de données à côté du répertoire 'bin'.

Donc, j'ai créé manuellement le répertoire 'data' sous "C: \ Program Files \ MySQL \ MySQL Server 8.0". Et cela a fonctionné (changer le mot de passe root en suivant les étapes suggérées sur https://dev.mysql.com/doc/mysql-windows-excerpt/5.7/en/resetting-permissions-windows.html .

Parc JongBum
la source
0

Digital Ocean MySql 2002-no-such-file-or-directory

Ajouter cette fin de fichier /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Redémarrez MySql

service mysql restart

Ajmirani
la source
-1

J'ai également eu le même problème sur un serveur Linux. Ce qui m'a aidé est la commande ' sudo reboot ', qui est utilisée pour redémarrer le serveur Linux.

SumitK
la source
-2

activer et démarrer le service mariadb

sudo systemctl activer mariadb.service

sudo systemctl démarre mariadb.service

Anil K Shrestha
la source