Cosa dovrebbe contenere mysqld.sock, perché non l'ho?


22

Qualcuno sa perché il mio /var/run/mysqld/mysqld.sockfile socket non sarebbe sul mio computer quando installo (o reinstallo) MySQL 5.1?

In questo momento, quando provo ad avviare un server con mysqld, ottengo errori simili Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect, ma la creazione di un file vuoto con quel nome (come suggerito sui forum di Ubuntu) non ha avuto successo.

Avevo sia mysql che postgres che funzionavano bene fino a quando non sono passato a natty poco fa; Ho passato ore a sfogliare entrambi i database cercando di capire cosa stesse succedendo. Posso rinunciare a Postgres, ma non posso lavorare senza una copia funzionante di mysql.

La parte più strana: uso Kubuntu e la mia comprensione è che KDE usa mysql per archiviare i permessi degli utenti, ecc. Non sto riscontrando strani problemi con i permessi; posso prendere questo per significare che (in qualche modo?) MySQL funziona davvero?

Forse questi file socket vivono in un posto diverso in Natty? Sarebbe più semplice reinstallare il sistema operativo appena aggiornato? A questo punto, sono aperto a qualsiasi suggerimento che smetta di sprecare il mio tempo.


Devi prima avviare mysql server e poi quel file /var/run/mysqld/mysqld.sockverrà creato. Come ha detto @Paul, devi rimuovere qualsiasi file inserito in quella posizione.
Evan Hu,

Risposte:


18

Un file socket in realtà non contiene dati, li trasporta. È un tipo speciale, insolito di file creato con speciali chiamate / comandi di sistema. Non è un file normale.

È come una pipa che il server e i client possono utilizzare per connettersi e scambiare richieste e dati. Inoltre, viene utilizzato solo localmente. Il suo significato è semplicemente una posizione di appuntamento concordata nel filesystem.

La creazione di un semplice file vecchio e il suo inserimento in quella posizione potrebbero effettivamente interferire con il server che lo crea ... e quindi impedire ai client locali di connettersi al server.

La mia raccomandazione è di rimuovere qualsiasi file inserito nella posizione. Il file socket speciale viene creato dal server.


1
Grazie per la spiegazione dei file socket e scusa per la domanda scarsamente formulata: il mio problema originale era che mancava il file socket - l'errore che MySQL continuava a lanciare eraCan't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
egbutter,

ma come viene creato? perchè ancora non ce l'ho .. MrGreen qualche idea?
jpganz18,

Probabilmente hai un client mysql che si aspetta che il socket si trovi in ​​quella posizione, ma il server non lo crea lì (o il server non è in esecuzione) Se il server è in esecuzione, cerca in / tmp o usa trova o trova per trova il file socket, quindi avvia il client mysql con -S <percorso del file socket>
sed_and_done

20

Quando si specifica host=localhost, il client mysql tenterà di accedere al server mysql utilizzando unix denominato pipe che richiede un .sockfile.

Questo può essere bypassato specificando host = 127.0.0.1. Questo farà sì che il client mysql usi TCP per connettersi al server.

Tratto dalla documentazione di MySQL :

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass

Questa è in realtà una risposta brillante (e molto necessaria) perché, storicamente parlando, ho visto mysql.sockscomparire senza una buona ragione in ogni versione di MySQL con cui ho lavorato (fino alla 4.0). Quando ciò accade, eseguo l'accesso in questo modo ma lo uso --protocol=tcpinvece di --port. Quando si arresta mysql, il servizio cerca il file socket. Pertanto, la corsa service mysql stopfallirebbe. Per aggirare il mal di testa del file socket mancante, corro mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdown. Oh, a proposito, +1 !!!
RolandoMySQLDBA,

Grazie. Questa è stata la mia prima risposta ovunque online :) E sì. Un metodo alternativo per usare TCP è specificando --protocol = tcp.
sccott

14

Un socket è uno pseudo-file speciale utilizzato per la trasmissione dei dati mediante lettura e scrittura, non per l'archiviazione dei dati.

Il file socket viene creato all'avvio del servizio e rimosso al termine del servizio. La posizione del file è definita in questo /etc/my.cnfmodo:

[mysqld]
socket=/var/run/mysql/mysql.sock

8

Nel mio caso, l'esecuzione ha mysqld_safecreato un nuovo mysqld.sockfile.

$ cd /etc/init.d/
$ mysqld_safe

Probabilmente non riceverai il prompt, ma se riavvii la sessione, un file mysqld.sock sarà da qualche parte. Trovalo con

$ sudo find / -type s | grep mysqld.sock

2

Ho avuto lo stesso problema con il mysqld.sock mancante. Sono andato nella directory che conteneva mysql, vale /usr/bina dire nel mio caso. Quindi ho emesso il comando

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

Il doppio mysql non è un errore di battitura, ma piuttosto mysql è un database che sarà sempre presente in una nuova installazione di MySQL. Non so se --host, --passwordo --portsono necessari, ma dal momento che ha funzionato per me usando questi parametri li sto includendo. Una volta che MySQL è arrivato, sono andato nella tabella degli utenti come impostare la password per root. Una volta che MySQL è arrivato, è stato creato il file socket mancante. Spero che questo aiuti qualcuno dal momento che ho lottato per giorni.


1

Se si utilizza nginx php-fastcgi e si è verificato un errore 502 Bad Gateway di quello che si deve guardare alla configurazione dell'host virtuale sul file di configurazione di nginx. Devi impostare o correggere il fastcgi_passparametro. fastcgi_passÈ la variabile per impostare la connessione socket tra nginx e php CGI.

Un altro punto problematico è che lo script di avvio binario potrebbe perdere le seguenti voci (importanti) aperte con: nano /usr/bin/php-fastcgi

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

Il contenuto completo del mio script iniziale / 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.