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)
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.
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:
localhost
, un socket ou un tuyau est utilisé.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.
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
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': '',
},
}
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.
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': '',
},
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
Exécuter le cmd ci-dessous dans le terminal
/ usr/local/mysql/bin/mysqld_safe
Puis redémarrez la machine pour prendre effet. Ça marche!!
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.
Après avoir essayé quelques-unes de ces solutions sans succès, voici ce qui a fonctionné pour moi
Cela peut être l’un des problèmes suivants.
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.
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.
J'ai deux conjectures sournoises sur celui-ci
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
.
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?
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.
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!
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' : ''
}
}
Assurez-vous que votre/etc/hosts a 127.0.0.1 localhost
et qu'il devrait fonctionner correctement
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.
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;
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.
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.
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?
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
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.
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).
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.
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é.
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=