web-dev-qa-db-fra.com

Impossible de se connecter au serveur MySQL local via le socket '/tmp/mysql.sock

Lorsque j'ai tenté de me connecter à un serveur MySQL local au cours de ma suite de tests, il échoue avec l'erreur:

OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

Cependant, je peux à tout moment me connecter à MySQL en exécutant le programme en ligne de commande mysql. Un ps aux | grep mysql indique que le serveur est en cours d'exécution et stat /tmp/mysql.sock confirme que le socket existe. En outre, si j'ouvre un débogueur Dans la clause except de cette exception, je peux connecter de manière fiable Avec exactement les mêmes paramètres.

Ce problème se reproduit de manière assez fiable, mais il ne semble pas être à 100%, Parce que chaque fois dans une lune bleue, ma suite de tests est exécutée sans que. Quand j'ai essayé de courir avec Sudo dtruss, il ne s'est pas reproduit.

Tout le code client est en Python, bien que je ne sache pas en quoi cela serait pertinent.

Le passage à utiliser l'hôte 127.0.0.1 génère l'erreur:

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)
97
Alex Gaynor
Sudo /usr/local/mysql/support-files/mysql.server start 

Cela a fonctionné pour moi. Cependant, si cela ne fonctionne pas, assurez-vous que mysqld est en cours d'exécution et essayez de vous connecter.

138
Pratyay

La section pertinente du manuel MySQL est ici . Je commencerais par passer en revue les étapes de débogage énumérées ici.

De plus, rappelez-vous que localhost et 127.0.0.1 ne sont pas la même chose dans ce contexte:

  • Si l'hôte est défini sur localhost, un socket ou un tuyau est utilisé.
  • Si Host est défini sur 127.0.0.1, le client est obligé d'utiliser TCP/IP.

Ainsi, par exemple, vous pouvez vérifier si votre base de données écoute les connexions TCP vi netstat -nlp. Il semble probable que IS écoute pour les connexions TCP car vous dites que mysql -h 127.0.0.1 fonctionne parfaitement. Pour vérifier si vous pouvez vous connecter à votre base de données via des sockets, utilisez mysql -h localhost

Si cela ne vous aide pas, alors vous aurez probablement besoin de publier plus de détails sur votre configuration MySQL, comment instancier la connexion, etc.

68
jtoberon

Pour moi, le problème était que je n’exécutais pas mysql server . Exécutez d’abord le serveur puis exécutez mysql.

$ mysql.server start
$ mysql -h localhost -u root -p
63
yask

J'ai vu cela se produire dans ma boutique lorsque mes développeurs ont un gestionnaire de pile tel que MAMP, préconfiguré avec MySQL installé à un emplacement non standard.

à votre terminal 

mysql_config --socket

cela vous donnera votre chemin vers le fichier chaussette. empruntez ce chemin et utilisez-le dans votre paramètre de base de données hôte DATABASES.

Ce que vous devez faire, c'est pointer votre 

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test',
        'Host': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '',
    },
}

REMARQUE

exécutez aussi which mysql_config si vous avez en quelque sorte plusieurs instances de serveur mysql installées sur la machine, vous vous connectez peut-être au mauvais.

21

Je viens de changer la Host de localhost à 127.0.0.1 et cela fonctionne bien:

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'Host': '127.0.0.1',
        'PORT': '',
},
12
Sirbito X

Quand, si vous perdez votre démon mysql sous mac OSx mais qu'il est présent dans un autre chemin, par exemple dans private/var, exécutez la commande suivante

1)

ln -s /private/var/mysql/mysql.sock /tmp/mysql.sock

2) redémarrez votre connexion à mysql avec:

mysql -u username -p -h Host databasename

fonctionne aussi pour mariadb

10
aurny2420289

Exécuter le cmd ci-dessous dans le terminal 

/ usr/local/mysql/bin/mysqld_safe

enter image description here

Puis redémarrez la machine pour prendre effet. Ça marche!!

8
Prashanth Sams

Vérifiez le nombre de fichiers ouverts pour le processus mysql à l'aide de la commande lsof. 

Augmentez la limite de fichiers ouverts et exécutez à nouveau.

7
hsen

Après avoir essayé quelques-unes de ces solutions sans succès, voici ce qui a fonctionné pour moi

  1. Redémarrer le système
  2. mysql.server start
  3. Succès!
7
Mark Lohr

Cela peut être l’un des problèmes suivants.

  1. Mysql lock incorrect . Solution: Vous devez trouver le bon socket mysql en,

mysqladmin -p variables | prise grep

puis mettez-le dans votre code de connexion à la base de données: 

pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")

/tmp/mysql.sock est le retour de grep

2.Inconvénient du port mysql solution: Vous devez trouver le bon port mysql:

mysqladmin -p variables | grep port

et ensuite dans votre code:

pymysql.connect(db='db', user='user', passwd='pwd', Host='localhost', port=3306)

3306 est le port renvoyé par le grep

Je pense que la première option résoudra votre problème. 

5
Chamith Malinda

Je pense avoir vu le même comportement il y a quelque temps, mais je ne me souviens pas des détails.
Dans notre cas, le problème était le moment où le testrunner initialisait les connexions à la base de données par rapport à la première interaction de base de données requise, par exemple, en important un module dans settings.py ou un __init __. Py ..__ Détecter quelques informations supplémentaires, mais cela pourrait déjà sonner une cloche pour votre cas.

4
Martin

J'ai deux conjectures sournoises sur celui-ci

CONJECTURE # 1

Examinez la possibilité de ne pas pouvoir accéder au fichier /tmp/mysql.sock. Lorsque je configure des bases de données MySQL, je laisse normalement le site de fichier de socket dans /var/lib/mysql. Si vous vous connectez à mysql en tant que root@localhost, votre session de système d'exploitation doit accéder au dossier /tmp. Assurez-vous que /tmp dispose des droits d'accès appropriés dans le système d'exploitation. Assurez-vous également que l'utilisateur de Sudo peut toujours lire le fichier dans /tmp.

CONJECTURE # 2

Accéder à mysql via 127.0.0.1 peut créer une certaine confusion si vous ne faites pas attention. Comment?

À partir de la ligne de commande, si vous vous connectez à MySQL avec 127.0.0.1, vous devrez peut-être spécifier le protocole TCP/IP.

mysql -uroot -p -h127.0.0.1 --protocol=tcp

ou essayez le nom DNS

mysql -uroot -p -hDNSNAME

Cela contournera la connexion en tant que root@localhost, mais assurez-vous que vous avez défini root@'127.0.0.1'.

La prochaine fois que vous vous connecterez à MySQL, lancez ceci:

SELECT USER(),CURRENT_USER();

Qu'est-ce que cela vous donne?

  • USER () indique comment vous avez tenté de vous authentifier avec MySQL
  • CURRENT_USER () indique comment vous avez été autorisé à vous authentifier dans MySQL

Si ces fonctions reviennent avec les mêmes valeurs, vous vous connectez et vous authentifiez comme prévu. Si les valeurs sont différentes, vous devrez peut-être créer l'utilisateur [email protected] correspondant.

3
RolandoMySQLDBA

Avait ce même problème. Il s'est avéré que mysqld avait cessé de fonctionner (je suis sous Mac OSX). Je l'ai redémarré et l'erreur est partie.

J'ai découvert que mysqld ne fonctionnait pas principalement à cause de ce lien: http://dev.mysql.com/doc/refman/5.6/fr/can-not-connect-to-server.html

Remarquez le premier conseil!

3
Ben Rollert

si vous obtenez une erreur comme ci-dessous:

Django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

Ensuite, il vous suffit de trouver l’emplacement de votre fichier mysqld.sock et de l’ajouter à "Hôte".

Comme si j'utilisais xampp sur linux, mon fichier mysqld.sock est à un autre emplacement. donc ça ne marche pas pour '/var/run/mysqld/mysqld.sock'

DATABASES = {

    'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'asd',
        'USER' : 'root',
        'PASSWORD' : '',
        'Host' : '/opt/lampp/var/mysql/mysql.sock',
        'PORT' : ''
    }
}
3
Shyam

Assurez-vous que votre/etc/hosts a 127.0.0.1 localhost et qu'il devrait fonctionner correctement

2
hd1

Vérifiez que votre mysql n’a pas atteint le nombre maximum de connexions, ou n’est pas dans une sorte de boucle d’amorçage, comme cela arrive souvent si les paramètres sont incorrects dans my.cnf.

Utilisez ps aux | grep mysql pour vérifier si le PID est en train de changer.

2
beiller

J'ai trop regardé en ligne pour ne pas contribuer. Après avoir essayé de taper l'invite mysql à partir de la ligne de commande, je continuais à recevoir ce message:

ERREUR 2002 (HY000): Impossible de se connecter au serveur MySQL local via le socket '/tmp/mysql.sock' (2)

Cela était dû au fait que mon serveur mysql local ne fonctionnait plus. Afin de redémarrer le serveur, je suis allé à

Shell> cd /user/local/bin

où mon mysql.server était situé. A partir de là, tapez simplement: 

Shell> mysql.server start

Cela relancera le serveur mysql local.

De là, vous pouvez réinitialiser le mot de passe root si besoin est.

mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
->                   WHERE User='root';
mysql> FLUSH PRIVILEGES;
2
preynolds

Pour ceux qui ont mis à niveau de la version 5.7 à la version 8.0 via homebrew, cette erreur est probablement due au fait que la mise à niveau n'est pas terminée. Dans mon cas, mysql.server start m'a généré l'erreur suivante:

ERREUR! Le serveur s'est arrêté sans mettre à jour le fichier PID

J'ai ensuite vérifié le fichier journal via cat /usr/local/var/mysql/YOURS.err | tail -n 50 et trouvé ce qui suit:

InnoDB: La mise à niveau après un crash n'est pas prise en charge. 

Si vous êtes sur le même bateau, commencez par installer [email protected] via homebrew, arrêtez le serveur, puis redémarrez le système 8.0.

brew install [email protected]

/usr/local/opt/[email protected]/bin/mysql.server start
/usr/local/opt/[email protected]/bin/mysql.server stop

Ensuite,

mysql.server start

Cela permettrait à votre MySQL (8.0) de fonctionner à nouveau.

1
Blaszard

J'ai dû supprimer toutes les instances de mysql en recherchant d'abord tous les ID de processus:

ps aux | grep mysql

Et puis les tuer:

kill -9 {pid}

Ensuite:

mysql.server start

Travaillé pour moi.

1
HomerPlata

Le socket est situé dans/tmp. Sur les systèmes Unix, cela pourrait poser problème à cause des modes et des propriétés de/tmp. Mais, tant que vous nous dites que vous POUVEZ utiliser votre connexion mysql normalement, je suppose que ce n'est pas un problème sur votre système. Une vérification primale devrait consister à déplacer mysql.sock dans un répertoire plus neutre.

Le fait que le problème se produise "de manière aléatoire" (ou pas à chaque fois) me laisse penser que cela pourrait être un problème de serveur. 

  • Votre/tmp se trouve-t-il sur un disque standard ou sur un montage exotique (comme dans la RAM)?

  • Votre/tmp est-il vide? 

  • iotop vous montre-t-il quelque chose qui ne va pas lorsque vous rencontrez le problème?

1
Koreth

Configurez votre connexion à la base de données dans la boîte de dialogue 'Gérer les connexions à la base de données. Sélectionnez «Standard (TCP/IP)» comme méthode de connexion.

Voir cette page pour plus de détails http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

Selon cette autre page , un fichier de socket est utilisé même si vous spécifiez localhost.

Un fichier de socket Unix est utilisé si vous ne spécifiez pas de nom d’hôte ou si spécifiez le nom d'hôte spécial localhost.

Il montre également comment vérifier sur votre serveur en exécutant ces commandes:

Si un processus mysqld est en cours d'exécution, vous pouvez le vérifier en essayant le fichier commandes suivantes. Le numéro de port ou le nom du fichier de socket Unix peut être différent dans votre configuration. Host_ip représente l'adresse IP du machine sur laquelle le serveur est en cours d'exécution.

Shell> mysqladmin version 
Shell> mysqladmin variables 
Shell> mysqladmin -h `hostname` version variables 
Shell> mysqladmin -h `hostname` --port=3306 version 
Shell> mysqladmin -h Host_ip version 
Shell> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version
0
Only You

Si c'est lié au socket, lisez ce fichier

/etc/mysql/my.cnf

et voyez quel est l'emplacement de la prise standard. C'est une ligne comme:

socket = /var/run/mysqld/mysqld.sock

maintenant, créez un alias pour votre shell comme:

alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"

De cette façon, vous n'avez pas besoin de privilèges root.

0
MaxV

Pour moi, je suis sûr que mysqld est démarré et que mysql en ligne de commande peut fonctionner correctement. Mais le serveur httpd montre le problème (impossible de se connecter à mysql via socket).

J'ai démarré le service avec mysqld_safe &.

enfin, lorsque j'ai démarré le service mysqld avec le service mysqld start, des problèmes se sont posés (problème de permission de selinux) et, lorsque je corrige le problème selinux, et que je lance mysqld avec "service mysqld start", le problème de connexion httpd disparaît. Mais quand je lance mysqld avec mysqld_safe &, mysqld peut être travaillé. (le client mysql peut fonctionner correctement). Mais il y a toujours un problème lors de la connexion avec httpd.

0
Robin LI

Essayez simplement de lancer mysqld

C’est ce qui ne fonctionnait pas pour moi sur mac . Si cela ne fonctionne pas, essayez d’accéder à /usr/local/var/mysql/<your_name>.err pour consulter le journal des erreurs détaillé.

0
eloone

dans Ubuntu 14.04, vous pouvez le faire pour résoudre ce problème.

zack@zack:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket**
Enter password: 
| socket                                            | ***/var/run/mysqld/mysqld.sock***                                                                                            |
zack@zack:~/pycodes/python-scraping/chapter5$***ln -s  /var/run/mysqld/mysqld.sock /tmp/mysql.sock***
zack@zack:~/pycodes/python-scraping/chapter5$ ll /tmp/mysql.sock 
lrwxrwxrwx 1 zack zack 27 11月 29 13:08 /tmp/mysql.sock -> /var/run/mysqld/mysqld.sock=
0
ZackZang