¿Qué debe contener mysqld.sock? ¿Por qué no lo tengo?

22

¿Alguien sabe por qué mi /var/run/mysqld/mysqld.sockarchivo de socket no estaría en mi computadora cuando instalo (o reinstalo) MySQL 5.1?

En este momento, cuando intento iniciar un servidor con mysqld, recibo errores como Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect, pero la creación de un archivo en blanco con ese nombre (como se sugiere en los foros de ubuntu) no tuvo éxito.

Tenía mysql y postgres funcionando bien hasta que me actualicé a natty hace un tiempo; He pasado horas recorriendo ambas bases de datos tratando de descubrir qué está pasando. Puedo renunciar a postgres, pero no puedo trabajar sin una copia de trabajo de mysql.

La parte más extraña: uso Kubuntu, y entiendo que KDE usa mysql para almacenar permisos de usuario, etc. No estoy experimentando ningún problema de permisos extraño; ¿Puedo tomar esto como que (de alguna manera?) MySQL realmente está funcionando?

¿Quizás estos archivos de socket viven en un lugar diferente en natty? ¿Sería más fácil reinstalar el sistema operativo fresco? En este punto, estoy abierto a cualquier sugerencia que deje de perder el tiempo.

egbutter
fuente
Primero debe iniciar el servidor mysql y luego se /var/run/mysqld/mysqld.sockcreará ese archivo . Como dijo @Paul, debes eliminar cualquier archivo que coloques en esa ubicación.
Evan Hu

Respuestas:

18

Un archivo de socket no contiene datos, sino que lo transporta. Es un tipo de archivo especial e inusual creado con llamadas / comandos especiales del sistema. No es un archivo ordinario.

Es como una tubería que el servidor y los clientes pueden usar para conectarse e intercambiar solicitudes y datos. Además, solo se usa localmente. Su importancia es simplemente como una ubicación de cita acordada en el sistema de archivos.

Crear un archivo antiguo y ponerlo en esa ubicación puede interferir con el servidor que lo crea ... y, por lo tanto, evitar que los clientes locales se conecten al servidor.

Mi recomendación es eliminar cualquier archivo que coloque en la ubicación. El archivo de socket especial es creado por el servidor.

Paul
fuente
1
Gracias por la explicación de los archivos de socket, y lo siento por la pregunta mal redactada: mi problema original era que faltaba el archivo de socket, el error que mysql seguía arrojando eraCan't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
ejemplo, el
pero como se crea? porque todavía no lo tengo ..: -s alguna idea?
jpganz18
Probablemente tenga un cliente mysql que espera que el socket esté en esa ubicación, pero el servidor no lo crea allí (o el servidor no se está ejecutando) Si el servidor se está ejecutando, busque en / tmp o use buscar o localizar para encuentre el archivo socket, luego inicie el cliente mysql con -S <ruta al archivo socket>
sed_and_done
20

Cuando especifique host=localhost, el cliente mysql intentará iniciar sesión en el servidor mysql utilizando un canal con nombre unix que requiere un .sockarchivo.

Esto puede evitarse especificando host = 127.0.0.1. Esto hará que el cliente mysql use TCP para conectarse al servidor.

Tomado de la documentación de MySQL :

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass
sccott
fuente
Esta es realmente una respuesta brillante (y muy necesaria) porque, históricamente hablando, he visto mysql.sockdesaparecer sin razón alguna en todas las versiones de MySQL con las que he trabajado (volver a 4.0). Cuando esto sucede, me conecto así, pero lo uso en --protocol=tcplugar de --port. Cuando cierra mysql, el servicio busca el archivo socket. Por lo tanto, correr service mysql stopfallaría. Para evitar el dolor de cabeza del archivo socket que faltaba, corro mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdown. ¡Oh, por cierto, +1!
RolandoMySQLDBA
Gracias. Esta fue mi primera respuesta en cualquier lugar en línea :) Y sí. El método alternativo para usar TCP es especificando --protocol = tcp.
sccott
14

Un socket es un pseudoarchivo especial utilizado para la transmisión de datos mediante lectura y escritura, no almacenamiento de datos.

El archivo de socket se crea cuando se inicia el servicio y se elimina cuando se termina el servicio. La ubicación del archivo se define /etc/my.cnfasí:

[mysqld]
socket=/var/run/mysql/mysql.sock
Miguel
fuente
8

En mi caso, la ejecución mysqld_safecreó un nuevo mysqld.sockarchivo.

$ cd /etc/init.d/
$ mysqld_safe

Probablemente no recibirá un aviso de regreso, pero si reinicia su sesión, habrá un archivo mysqld.sock en alguna parte. Encuéntralo con

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

Tuve el mismo problema con el mysqld.sock faltante. Fui al directorio que contenía mysql, es decir, /usr/binen mi caso. Entonces emití el comando

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

El doble mysql no es un error tipográfico, sino que mysql es una base de datos que siempre estará allí en una nueva instalación de MySQL. No sé si --host, --passwordo --portestán necesitaba, pero ya que trabajó para mí el uso de estos parámetros que les incluyo. Una vez que apareció MySQL, entré en la tabla de usuario y configuré la contraseña para root. Una vez que apareció MySQL, se creó el archivo de socket que faltaba. Espero que esto ayude a alguien ya que luché durante días.

James
fuente
1

Si está utilizando nginx php-fastcgi y recibió un error 502 Bad Gateway , entonces debe mirar la configuración de su host virtual en el archivo de configuración nginx. Debe establecer o corregir el fastcgi_passparámetro. fastcgi_passEs la variable para establecer la conexión de socket entre nginx y php CGI.

Otro punto de problema es que el script de inicio binario podría perder las siguientes entradas (importantes) abiertas con: nano /usr/bin/php-fastcgi

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

El contenido completo de mi script de inicio / 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
fuente