O que o mysqld.sock deve conter, por que não o tenho?

22

Alguém sabe por que meu /var/run/mysqld/mysqld.sockarquivo de soquete não estaria no meu computador quando instalo (ou reinstalei) o MySQL 5.1?

No momento, quando tento iniciar um servidor com o mysqld, recebo erros como Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect, mas a criação de um arquivo em branco com esse nome (conforme sugerido nos fóruns do ubuntu) não teve êxito.

Eu tinha o mysql e o postgres servindo bem até atualizar para o natty há pouco tempo; Passei horas percorrendo os dois bancos de dados tentando descobrir o que está acontecendo. Posso desistir do postgres, mas não posso trabalhar sem uma cópia de trabalho do mysql.

A parte mais estranha: eu uso o Kubuntu, e meu entendimento é que o KDE usa o mysql para armazenar permissões de usuário, etc. Não estou tendo problemas com permissões estranhas; posso entender isso (de alguma forma?) o MySQL está realmente funcionando?

Talvez esses arquivos de soquete morem em um lugar diferente no natty? Seria mais fácil apenas reinstalar o sistema operacional fresco? Neste momento, estou aberto a sugestões que parem de desperdiçar meu tempo.

egbutter
fonte
Você precisa iniciar o servidor mysql primeiro e, em seguida, esse arquivo /var/run/mysqld/mysqld.sockserá criado. Como o @Paul disse, você deve remover qualquer arquivo que você colocar nesse local.
Evan Hu

Respostas:

18

Um arquivo de soquete, na verdade, não contém dados, ele os transporta. É um tipo especial e incomum de arquivo criado com chamadas / comandos especiais do sistema. Não é um arquivo comum.

É como um canal que o servidor e os clientes podem usar para conectar e trocar solicitações e dados. Além disso, é usado apenas localmente. Seu significado é meramente um local de encontro acordado no sistema de arquivos.

Criar um arquivo antigo simples e colocá-lo nesse local pode realmente interferir com a criação do servidor ... e, assim, impedir que os clientes locais se conectem ao servidor.

Minha recomendação é remover qualquer arquivo que você colocar no local. O arquivo de soquete especial é criado pelo servidor.

Paulo
fonte
1
Obrigado pela explicação de arquivos de socket, e desculpe a pergunta mal-formulada: o meu problema original era que o arquivo socket estava faltando - o lançamento de erro mysql mantido foiCan't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
egbutter
mas como é criado? porque ainda não tenho ..: -Tem alguma ideia?
precisa saber é o seguinte
Você provavelmente tem um cliente mysql que espera que o soquete esteja nesse local, mas o servidor não o cria lá (ou o servidor não está em execução). Se o servidor estiver em execução, procure em / tmp ou use find ou find para encontrar o arquivo socket, em seguida, iniciar o cliente mysql com -S <caminho para o arquivo de socket>
sed_and_done
20

Quando você especificar host=localhost, o cliente mysql tentará efetuar login no servidor mysql usando o pipe nomeado unix, que requer um .sockarquivo.

Isso pode ser ignorado especificando host = 127.0.0.1. Isso fará com que o cliente mysql use o TCP para se conectar ao servidor.

Retirado da documentação do MySQL :

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass
sccott
fonte
Essa é realmente uma resposta brilhante (e muito necessária) porque, historicamente falando, eu vi o mysql.sockdesaparecimento sem uma boa razão em todas as versões do MySQL com as quais trabalhei (de volta à 4.0). Quando isso acontece, eu logo assim, mas uso em --protocol=tcpvez de --port. Quando você encerra o mysql, o serviço procura o arquivo de soquete. Assim, a execução service mysql stopfalharia. Para contornar a dor de cabeça do arquivo de soquete ausente, eu corro mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdown. Ah, BTW, +1 !!!
RolandoMySQLDBA
Obrigado. Esta foi a minha primeira resposta em qualquer lugar online :) E sim. O método alternativo para usar o TCP é especificando --protocol = tcp.
sccott
14

Um soquete é um pseudo-arquivo especial usado para transmissão de dados pela leitura e gravação, não pelo armazenamento de dados.

O arquivo de soquete é criado quando o serviço é iniciado e removido quando o serviço é finalizado. A localização do arquivo é definida da seguinte /etc/my.cnfforma:

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

No meu caso, a execução mysqld_safecriou um novo mysqld.sockarquivo.

$ cd /etc/init.d/
$ mysqld_safe

Você provavelmente não receberá um aviso de volta, mas se você reiniciar sua sessão, um arquivo mysqld.sock estará em algum lugar. Encontre com

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

Eu tive o mesmo problema com o mysqld.sock ausente. Eu fui ao diretório que continha o mysql, a saber, /usr/binno meu caso. Então eu emiti o comando

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

O mysql duplo não é um erro de digitação, mas o mysql é um banco de dados que sempre estará presente em uma nova instalação do MySQL. Eu não sei se --host, --passwordou --portsão necessários, mas como funcionou para mim usando esses parâmetros, eu os incluo. Depois que o MySQL apareceu, entrei na tabela de usuários como defini a senha para root. Depois que o MySQL apareceu, o arquivo de soquete ausente foi criado. Espero que isso ajude alguém desde que lutei por dias.

James
fonte
1

Se você estiver usando o nginx php-fastcgi e tiver o erro 502 Bad Gateway , deverá procurar a configuração do host virtual no arquivo de configuração do nginx. Você deve definir ou corrigir o fastcgi_passparâmetro. fastcgi_passÉ a variável para definir a conexão do soquete entre nginx e php CGI.

Outro ponto de problema é que o script inicial binário pode perder as seguintes entradas (importantes) abertas com: nano /usr/bin/php-fastcgi

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

O conteúdo completo do meu script inicial / 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
fonte