Que doit contenir mysqld.sock, pourquoi ne l'ai-je pas?

22

Est-ce que quelqu'un sait pourquoi mon /var/run/mysqld/mysqld.sockfichier socket ne serait pas sur mon ordinateur lorsque j'installe (ou réinstalle) MySQL 5.1?

En ce moment, lorsque j'essaie de démarrer un serveur avec mysqld, j'obtiens des erreurs comme Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect, mais la création d'un fichier vierge avec ce nom (comme suggéré sur les forums ubuntu) n'a pas réussi.

J'ai utilisé à la fois mysql et postgres jusqu'à ce que je passe à natty il y a peu de temps; J'ai passé des heures à parcourir les deux bases de données pour essayer de comprendre ce qui se passe. Je peux abandonner les postgres, mais je ne peux pas travailler sans une copie de travail de mysql.

La partie la plus étrange: j'utilise Kubuntu, et ma compréhension est que KDE utilise mysql pour stocker les autorisations des utilisateurs, etc. Je ne rencontre aucun problème d'autorisations bizarre; puis-je prendre cela pour signifier que (en quelque sorte?) MySQL fonctionne réellement?

Peut-être que ces fichiers socket vivent dans un endroit différent dans natty? Serait-il plus facile de réinstaller simplement le système d'exploitation? À ce stade, je suis ouvert à toute suggestion qui arrêtera de perdre mon temps.

egbutter
la source
Vous devez d'abord démarrer le serveur mysql, puis ce fichier /var/run/mysqld/mysqld.socksera créé. Comme l'a dit @Paul, vous devez supprimer tout fichier que vous placez à cet emplacement.
Evan Hu

Réponses:

18

Un fichier socket ne contient pas réellement de données, il les transporte. Il s'agit d'un type de fichier spécial et inhabituel créé avec des appels / commandes système spéciaux. Ce n'est pas un fichier ordinaire.

C'est comme un canal que le serveur et les clients peuvent utiliser pour se connecter et échanger des demandes et des données. De plus, il n'est utilisé que localement. Son importance est simplement comme un lieu de rendez-vous convenu dans le système de fichiers.

La création d'un ancien fichier brut et son placement à cet emplacement peuvent en fait interférer avec la création du serveur ... et ainsi empêcher les clients locaux de se connecter au serveur.

Ma recommandation est de supprimer tout fichier que vous placez à l'emplacement. Le fichier socket spécial est créé par le serveur.

Paul
la source
1
Merci pour l'explication des fichiers de socket, et désolé pour la question mal formulée: mon problème d'origine était que le fichier de socket était manquant - l'erreur que mysql continuait de Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
produire
mais comment est-il créé? parce que je ne l'ai toujours pas ..: -s une idée?
jpganz18
Vous avez probablement un client mysql qui s'attend à ce que le socket soit à cet emplacement, mais le serveur ne le crée pas là (ou le serveur ne fonctionne pas). Si le serveur est en cours d'exécution, regardez dans / tmp ou utilisez find ou Locate pour trouvez le fichier socket, puis démarrez le client mysql avec -S <chemin vers le fichier socket>
sed_and_done
20

Lorsque vous spécifiez host=localhost, le client mysql essaiera de se connecter au serveur mysql en utilisant un canal nommé unix qui nécessite un .sockfichier.

Cela peut être contourné en spécifiant host = 127.0.0.1. Cela obligera le client mysql à utiliser TCP pour se connecter au serveur.

Tiré de la documentation de MySQL :

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass
sccott
la source
C'est en fait une réponse brillante (et bien nécessaire) parce que, historiquement parlant, j'ai vu mysql.sockdisparaître sans raison valable dans chaque version de MySQL avec laquelle j'ai travaillé (retour à 4.0). Lorsque cela se produit, je me connecte comme ça, mais j'utilise à la --protocol=tcpplace de --port. Lorsque vous arrêtez mysql, le service recherche le fichier socket. Ainsi, l'exécution service mysql stopéchouerait. Pour contourner le mal de tête du fichier socket manquant, je cours mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdown. Oh, BTW, +1 !!!
RolandoMySQLDBA
Merci. C'était ma première réponse n'importe où en ligne :) Et oui. La méthode alternative pour utiliser TCP consiste à spécifier --protocol = tcp.
sccott
14

Une socket est un pseudo-fichier spécial utilisé pour la transmission de données par lecture et écriture, pas pour le stockage de données.

Le fichier socket est créé au démarrage du service et supprimé à la fin du service. L'emplacement du fichier est défini /etc/my.cnfcomme suit :

[mysqld]
socket=/var/run/mysql/mysql.sock
Michael
la source
8

Dans mon cas, l'exécution a mysqld_safecréé un nouveau mysqld.sockfichier.

$ cd /etc/init.d/
$ mysqld_safe

Vous ne recevrez probablement pas d'invite, mais si vous redémarrez votre session, un fichier mysqld.sock sera quelque part. Trouvez-le avec

$ sudo find / -type s | grep mysqld.sock
aviggiano
la source
2

J'ai eu le même problème avec le mysqld.sock manquant. Je suis allé dans le répertoire qui contenait mysql, à savoir /usr/bindans mon cas. Ensuite, j'ai émis la commande

mysql mysql --host=localhost --password=whatever --port=3306

Le double mysql n'est pas une faute de frappe mais plutôt mysql est une base de données qui sera toujours là dans une nouvelle installation MySQL. Je ne sais pas si --host, --passwordou --portsont nécessaires, mais comme cela a fonctionné pour moi en utilisant ces paramètres, je les inclue. Une fois que MySQL est apparu, je suis entré dans la table utilisateur pour définir le mot de passe de root. Une fois MySQL lancé, le fichier socket manquant a été créé. J'espère que cela aide quelqu'un puisque j'ai eu du mal pendant des jours.

James
la source
1

Si vous utilisez nginx php-fastcgi et que vous avez obtenu une erreur 502 Bad Gateway , vous devez regarder votre configuration d'hôte virtuel sur le fichier de configuration nginx. Vous devez définir ou corriger le fastcgi_passparamètre. Il fastcgi_passs'agit de la variable permettant de définir la connexion socket entre nginx et php CGI.

Un autre problème est que le script de démarrage binaire pourrait manquer les entrées suivantes (importantes) ouvertes avec: nano /usr/bin/php-fastcgi

SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid

Le contenu complet de mon script de démarrage / usr / bin / php-fastcgi:

#!/bin/bash

FASTCGI_USER=www-data
FASTCGI_GROUP=www-data
SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
CHILDREN=6
PHP5=/usr/bin/php5-cgi

/usr/bin/spawn-fcgi -s $SOCKET -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5
Aysad Kozanoglu
la source