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


126

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

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

Cependant, je suis capable à tout moment de me connecter à MySQL en exécutant le mysqlprogramme de ligne de commande . Un ps aux | grep mysqlindique que le serveur est en cours d'exécution et stat /tmp/mysql.sockconfirme que le socket existe. De plus, si j'ouvre un débogueur dans la exceptclause de cette exception, je suis capable de me 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%, car chaque fois dans une lune bleue, ma suite de tests fonctionne en fait sans rencontrer cette erreur. Quand j'ai essayé de courir avec, sudo dtrussil ne s'est pas reproduit.

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

Le passage à utiliser l'hôte 127.0.0.1produit l'erreur:

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)

1
Est-il possible que vous atteigniez d'une manière ou d'une autre la base de données avec de nombreuses connexions simultanées? Essayez peut-être d'augmenter max_connectionsvotre fichier de configuration MySQL?
dgel

2
fait le mysql -h 127.0.0.1travail de la ligne de commande? Je ne suis pas sûr que votre serveur mysql écoute réellement sur un port TCP.
Eli

1
Êtes-vous sûr de disposer des bonnes versions des bibliothèques clientes Python MySQL pour votre version de MySQL? En outre, mysql -h localhostfonctionne-t-il de manière fiable?
Old Pro

2
MySQL enregistre-t-il quelque chose dans le journal des erreurs? Vérifiez également les autorisations des fichiers sur /tmp/mysql.sock et votre répertoire de données mysql. Les erreurs se produisent-elles également si vous exécutez la suite de tests en tant que root (sudo)?
Erik Cederstrand

2
Un grand nombre de ces suggestions sont couvertes par le manuel de référence officiel de MySQL auquel je fais référence dans ma réponse ci-dessous. C'est une meilleure utilisation du temps pour parcourir systématiquement les suggestions du manuel de référence MySQL, plutôt que d'essayer juste une ou deux de ces suggestions.
jtoberon

Réponses:


152
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.


1
J'ai passé plus de 2 semaines (je ne plaisante même pas) et c'est le plus proche que j'ai pour enfin pouvoir me connecter. Il est cependant bloqué sur 'démarrer mysql' ..... Mais merci, joli post!
L. Klotz

2
sudo: /usr/local/mysql/support-files/mysql.server: commande introuvable. Pourquoi?
Syam Pillai

1
Pourquoi un colon après sudo? Vérifiez si le chemin existe
Pratyay

Ou, si mysql est installé avec homebrew: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren

1
Le serveur s'est arrêté sans mettre à jour le fichier PID (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid).
saran3h

90

La section pertinente du manuel MySQL est ici . Je commencerais par suivre les étapes de débogage répertoriées ici.

Rappelez-vous également 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, alors un socket ou un tube est utilisé.
  • Si l'hôte est défini sur 127.0.0.1, le client est forcé 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 qu'il écoute les connexions TCP parce que vous dites que cela mysql -h 127.0.0.1fonctionne très bien. Pour vérifier si vous pouvez vous connecter à votre base de données via des sockets, utilisez mysql -h localhost.

Si rien de tout cela ne vous aide, vous devez probablement publier plus de détails sur votre configuration MySQL, comment vous instanciez la connexion, etc.


Bien qu'en général, suivre les procédures de diagnostic établies soit une bonne idée, si vous lisez la question (et les procédures), vous constatez que les procédures ont été suivies et que vous avez déterminé que ce n'est pas un problème avec le serveur MySQL. C'est quelque chose qui a spécifiquement à voir avec le client Python car tous les autres accès via le socket fonctionnent correctement, y compris les autres accès depuis Python.
Old Pro

1
Quel étrange vote. J'ai publié la procédure établie pour plusieurs raisons: (1) d'autres personnes ne publiaient qu'une partie de la procédure établie et il est préférable d'être systématique sur le débogage, (2) il semblait y avoir une certaine confusion concernant localhost vs 127.0.0.1, et (3 ) d'autres personnes avec le même symptôme «Impossible de se connecter au serveur mysql local» sont susceptibles de tomber sur cette question. Je suis conscient qu'il s'agit probablement du client Python, c'est pourquoi j'ai demandé plus d'informations, par exemple sur la manière dont la connexion est instanciée.
jtoberon

4
+1 J'obtenais cette erreur en essayant de me connecter à mysql via un tunnel ssh (en utilisant localhostcomme hôte). Changer pour le 127.0.0.1réparer.
krock

Pour mémoire, cela a résolu mon problème: "Impossible de se connecter au serveur MySQL local via le socket '/tmp/mysql.sock'".
proinsias

Merci! cela a fonctionné pour moi ce correctif en essayant de se connecter à un conteneur docker maridb.
Lucian Oprea

86

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

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

28

J'ai vu cela se produire dans ma boutique lorsque mes développeurs ont un gestionnaire de pile comme MAMP installé qui est préconfiguré avec MySQL installé dans un endroit non standard.

à votre terminal

mysql_config --socket

cela vous donnera votre chemin vers le fichier chaussette. prenez ce chemin et utilisez-le dans votre paramètre DATABASES HOST.

Ce que vous devez faire est de 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 également which mysql_configsi vous avez en quelque sorte plusieurs instances du serveur mysql installées sur la machine que vous vous connectez peut-être à la mauvaise.


Et si votre fichier chaussette est manquant?
AlxVallejo

acheter une autre paire? j / k cela signifie que le service mysql n'est pas en cours d'exécution. démarrer / redémarrer votre mysql
Francis Yaconiello

6
Dans mon cas, changer HOST de "localhost" à "127.0.0.1" a résolu le problème.
lucaswxp

@lucaswxp: Dans mon cas, je dois changer localhost avec le nom de domaine
Anshul Mishra

19

Je viens de changer le HOSTde localhostà 127.0.0.1et cela fonctionne bien:

# settings.py of Django project
...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
},
...

4
Ce serait bien de savoir quel fichier vous avez changé et où il se trouve
Empi

1
Dans settings.pyle projet.
Sirbito X

11

Quand, si vous perdez votre démon mysql sous mac OSx mais 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


9

Exécutez le cmd ci-dessous dans le terminal

/ usr / local / mysql / bin / mysqld_safe

entrez la description de l'image ici

Redémarrez ensuite la machine pour prendre effet. Ça marche!!


1
Cela a fonctionné pour moi sur un iMac exécutant High Sierra qui avait été mis à niveau vers Mojave. Ce qui a dû arriver, c'est que le fichier mysql.sock était dans tmp et supprimé lors de la mise à jour. Comme le socket est créé automatiquement au démarrage de MySQL, il vous suffit de vous assurer que MySQL est arrêté, puis de le démarrer en mode sans échec, comme ci-dessus. Le fichier mysql.sock apparaît comme par magie.
David

8

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

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


J'ai déjà rencontré cela auparavant, et vous ne pouvez pas simplement le faire via votre fichier .cnf. vous devrez peut-être ulimitaugmenter le nombre de fichiers ouverts que votre client et votre serveur sont autorisés à ouvrir. si vous utilisez une version récente d'ubuntu, cela peut nécessiter d'éditer le script upstart mysql dans / etc / init, mais j'espère que vous pouvez simplement le faire dans le fichier .cnf.
underrun

8

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

  1. Redémarrez le système
  2. mysql.server démarrer
  3. Succès!

7

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

  1. Verrou mysql incorrect. solution: vous devez trouver le bon socket mysql par,

mysqladmin -p variables | socket grep

puis mettez-le dans votre code de connexion db:

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

/tmp/mysql.sock est le retour de grep

Solution de port mysql incorrecte: vous devez trouver le bon port mysql:

mysqladmin -p variables | grep port

puis 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.


6

Pour ceux qui sont passés de la version 5.7 à la 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 startj'ai obtenu 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 j'ai 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, installez d'abord mysql@5.7via homebrew, arrêtez le serveur, puis redémarrez le système 8.0.

brew install mysql@5.7

/usr/local/opt/mysql@5.7/bin/mysql.server start
/usr/local/opt/mysql@5.7/bin/mysql.server stop

Ensuite,

mysql.server start

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


J'obtiens encore la même chose ERROR! The server quit without updating PID file.
awebartisan

Dans mon cas, je viens d'installer mysql@5.7 et de supprimer le dernier. Tout a commencé. Aucune base de données supprimée.
Andrew Luca

4

Je pense avoir vu ce 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, par l'importation d'un module dans settings.py ou un __init__.py. Je vais essayer de trouver quelques informations supplémentaires, mais cela pourrait déjà vous rappeler.


4

Assurez-vous que votre / etc / hosts contient 127.0.0.1 localhostet qu'il devrait fonctionner correctement


Étonnamment (avec respect), cela a réglé le problème pour moi - en vérifiant cela, j'ai trouvé qu'en essayant de configurer webdav, Mavericks avait ajouté des lignes supplémentaires (totalement déformées) à mon fichier hôte - y compris une qui réaffectait localhost.
rob_was_taken

4

J'ai deux conjectures sournoises sur celle-ci

CONJECTURE # 1

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

CONJECTURE # 2

Accéder à mysql via 127.0.0.1peut être source de confusion si vous ne faites pas attention. Comment?

Depuis 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 root@'127.0.0.1'défini.

La prochaine fois que vous vous connectez à MySQL, exécutez ceci:

SELECT USER(),CURRENT_USER();

Qu'est-ce que cela vous donne?

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

Si ces fonctions retournent 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 correspondant root@127.0.0.1.



3

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, trouvez simplement l'emplacement de votre fichier mysqld.sock et ajoutez-le à "HOST".

Comme j'utilise xampp sur Linux, mon mysqld.sockfichier se trouve à 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' : ''
    }
}

2

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

Utilisez ps aux | grep mysql pour vérifier si le PID change.


2

J'ai cherché trop longtemps 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, j'ai navigué vers

shell> cd /user/local/bin

où se trouvait mon mysql.server. 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 nécessaire.

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

2

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

ps aux | grep mysql

Et puis les tuer:

tuer -9 {pid}

Ensuite:

mysql.server démarrer

A travaillé pour moi.


1

Le socket est situé dans / tmp. Sur le système Unix, en raison des modes et des propriétés sur / tmp, cela pourrait causer des problèmes. 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 primaire devrait être de déplacer mysql.sock dans un répertoire plus neutre.

Le fait que le problème se produise «au hasard» (ou pas à chaque fois) me laisse penser qu'il pourrait s'agir d'un problème de serveur.

  • Votre / tmp est-il situé sur un disque standard ou sur un support exotique (comme dans la RAM)?

  • Votre / tmp est-il vide?

  • Est iotop-ce que quelque chose ne va pas lorsque vous rencontrez le problème?


0

Configurez votre connexion DB dans la boîte de dialogue 'Manage DB Connections. 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 socket est utilisé même si vous spécifiez localhost.

Un fichier socket Unix est utilisé si vous ne spécifiez pas de nom d'hôte ou si vous 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 les 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 de la machine sur laquelle le serveur est exécuté.

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

dans ubuntu14.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

Pour moi, je suis sûr que mysqld est démarré et que la ligne de commande mysql 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, j'ai trouvé que lorsque je démarre le service mysqld avec le service mysqld start, il y a des problèmes (problème d'autorisation selinux), et quand je corrige le problème selinux et que je démarre mysqld avec "service mysqld start", le problème de connexion httpd disparaît. Mais quand je démarre le mysqld avec mysqld_safe &, mysqld peut fonctionner. (le client mysql peut fonctionner correctement). Mais il y a toujours des problèmes lors de la connexion avec httpd.


0

S'il s'agit d'un socket, lisez ce fichier

/etc/mysql/my.cnf

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

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

créez maintenant 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

Essayez simplement de courir mysqld.

C'était ce qui ne fonctionnait pas pour moi sur mac. Si cela ne fonctionne pas, essayez /usr/local/var/mysql/<your_name>.errde consulter les journaux d'erreurs détaillés.


0
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

Peut être utile.


Identique à la réponse la plus stellaire 'sudo /usr/local/mysql/support-files/mysql.server start', mais différents OS peuvent avoir un chemin différent du 'mysql.server'. J'ai donc essayé d'écrire une ligne de commande qui pourrait être utile dans de nombreux OS.
陈 也在 哦

0

Utilisation de MacOS Mojave 10.14.6 pour MySQL 8.0.19 installé via Homebrew

  • Ran sudo find / -name my.cnf
  • Fichier trouvé à /usr/local/etc/my.cnf

A travaillé pendant un certain temps, puis l'erreur est finalement retournée. Désinstallé la version Homebrew de MySQL et installé le fichier .dmg directement à partir d' ici

Heureusement connecté depuis.


0

Dans mon cas, ce qui a aidé était de modifier le fichier /etc/mysql/mysql.conf.d/mysqld.cnfet de remplacer la ligne:

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

avec

socket      = /tmp/mysql.sock

Ensuite, j'ai redémarré le serveur et cela a bien fonctionné. Le plus drôle, c'est que si je remets la ligne comme avant et que je la redémarre, cela fonctionne toujours.


0

J'avais été confronté à un problème similaire récemment. J'ai parcouru de nombreuses réponses. Je l'ai fait fonctionner en suivant les étapes.

  1. changez le chemin du socket dans /etc/my.cnf (comme j'obtenais à plusieurs reprises une erreur avec /tmp/mysql.sock) référence pour changer le chemin du socket
  2. exécutez mysqld_safe pour redémarrer le serveur car c'est la méthode recommandée pour redémarrer en cas d'erreurs. référence à mysqld_safe

0

Pour moi, le serveur mysql ne fonctionnait pas. Alors, j'ai démarré le serveur mysql via

mysql.server start

puis

mysql_secure_installation

pour sécuriser le serveur et maintenant je peux visiter le serveur MySQL via

sudo mysql -uroot -p

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.