Não é possível conectar ao servidor MySQL local através do soquete '/tmp/mysql.sock

126

Quando tentei conectar-me a um servidor MySQL local durante minha suíte de testes, ele falhou com o erro:

OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

No entanto, eu posso conectar o MySQL o tempo todo executando o mysqlprograma de linha de comando . A ps aux | grep mysqlmostra que o servidor está em execução e stat /tmp/mysql.sockconfirme se o soquete existe. Além disso, se eu abrir um depurador na exceptcláusula dessa exceção, posso conectar-me de maneira confiável com exatamente os mesmos parâmetros.

Esse problema é reproduzido com bastante confiabilidade, no entanto, não parece ser 100%, porque de vez em quando na lua azul, meu conjunto de testes é executado sem o erro. Quando tentei correr com sudo dtrussele não se reproduziu.

Todo o código do cliente está em Python, embora eu não consiga entender como isso seria relevante.

Mudar para usar host 127.0.0.1produz o erro:

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)
Alex Gaynor
fonte
1
É possível que você esteja de alguma forma atingindo o banco de dados com muitas conexões simultâneas? Talvez tente aumentar max_connectionsno seu arquivo conf MySQL?
Dgel
2
faz mysql -h 127.0.0.1o trabalho a partir da linha de comando? Não tenho tanta certeza de que seu servidor mysql esteja realmente escutando uma porta TCP.
Eli
1
Você tem certeza de que possui as versões corretas das bibliotecas cliente Python MySQL para sua versão do MySQL? Além disso, mysql -h localhostfunciona de maneira confiável?
Old Pro
2
O MySQL registra alguma coisa no log de erros? Além disso, verifique as permissões de arquivo em /tmp/mysql.sock e seu diretório de dados mysql. Os erros também ocorrem se você executar o conjunto de testes como root (sudo)?
Erik Cederstrand
2
Muitas dessas sugestões são cobertas pelo manual de referência oficial do MySQL, que refiro na minha resposta abaixo. É melhor usar o tempo para analisar sistematicamente as sugestões do manual de referência do MySQL, em vez de tentar apenas uma ou duas dessas sugestões.
jtoberon

Respostas:

152
sudo /usr/local/mysql/support-files/mysql.server start 

Isso funcionou para mim. No entanto, se isso não funcionar, verifique se o mysqld está em execução e tente conectar-se.

Pratyay
fonte
1
Passei mais de duas semanas (nem mesmo brincando) e é o mais próximo que consegui finalmente poder me conectar. No entanto, ele está preso no 'iniciando o mysql' ..... Mas obrigado, bom post!
L. Klotz
2
sudo: /usr/local/mysql/support-files/mysql.server: comando não encontrado. porque?
Syam Pillai
1
Por que dois pontos depois do sudo? Verifique se o caminho existe
Pratyay
Ou, se o mysql estiver instalado com o homebrew: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren
1
O servidor foi encerrado sem atualizar o arquivo PID (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid).
saran3h
89

A seção relevante do manual do MySQL está aqui . Eu começaria seguindo as etapas de depuração listadas lá.

Além disso, lembre-se de que localhost e 127.0.0.1 não são a mesma coisa neste contexto:

  • Se o host estiver definido como localhost, um soquete ou tubo será usado.
  • Se o host estiver definido como 127.0.0.1, o cliente será forçado a usar o TCP / IP.

Portanto, por exemplo, você pode verificar se o seu banco de dados está escutando conexões TCP vi netstat -nlp. Parece provável que ele esteja ouvindo conexões TCP porque você diz que mysql -h 127.0.0.1funciona muito bem. Para verificar se você pode se conectar ao seu banco de dados por soquetes, use mysql -h localhost.

Se nada disso ajudar, você provavelmente precisará postar mais detalhes sobre sua configuração do MySQL, exatamente como você está instanciando a conexão, etc.

outubro
fonte
Embora, em geral, siga os procedimentos de diagnóstico estabelecidos seja uma boa idéia, se você ler a pergunta (e os procedimentos), verá que os procedimentos foram seguidos e determinaram que isso não é um problema com o servidor MySQL. Isso é algo especificamente relacionado ao cliente Python, pois todos os outros acessos através do soquete funcionam bem, incluindo outros acessos do Python.
Old Pro
1
Que voto estranho. Publiquei o procedimento estabelecido por vários motivos: (1) outras pessoas estavam postando apenas parte do procedimento estabelecido e é melhor ser sistemático sobre a depuração, (2) parecia haver alguma confusão sobre localhost vs 127.0.0.1 e (3) ) outras pessoas com o mesmo sintoma "Não é possível conectar-se ao servidor mysql local" provavelmente encontrarão essa pergunta. Estou ciente de que provavelmente é o cliente Python, e é por isso que pedi mais informações, por exemplo, sobre como a conexão está sendo instanciada.
11123 outubro
3
+1 Eu estava recebendo este erro ao tentar conectar ao mysql através de um túnel ssh (usando localhostcomo host). Mudando para 127.0.0.1corrigi-lo.
krock
Para o registro, isso corrigiu meu problema: "Não é possível conectar ao servidor MySQL local através do soquete '/tmp/mysql.sock'".
proinsias
Obrigado! funcionou para mim essa correção ao tentar conectar-se a um contêiner do docker maridb.
Lucian Oprea
86

Para mim, o problema era que eu não estava executando o servidor mysql. Execute o servidor primeiro e depois execute mysql.

$ mysql.server start
$ mysql -h localhost -u root -p
yask
fonte
28

Eu já vi isso acontecer na minha loja, quando meus desenvolvedores têm um gerenciador de pilha como o MAMP instalado que vem pré-configurado com o MySQL instalado em um local não padrão.

no seu terminal

mysql_config --socket

que lhe dará seu caminho para o arquivo de meias. siga esse caminho e use-o no seu paramater DATABASES HOST.

O que você precisa fazer é apontar sua

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '',
    },
}

NOTA

Também execute which mysql_configse você de alguma forma tiver várias instâncias do servidor mysql instaladas na máquina, você pode estar se conectando à incorreta.

Francis Yaconiello
fonte
E se o seu arquivo de meia estiver faltando?
AlxVallejo 15/07
comprar outro par? j / k que significa que o serviço mysql não está sendo executado. inicie / reinicie o mysql
Francis Yaconiello
6
No meu caso, alterar o HOST de "localhost" para "127.0.0.1" resolveu o problema.
Lucaswxp #
@lucaswxp: No meu caso eu tenho que mudar localhost com o nome de domínio
Anshul Mishra
19

Acabei de alterar o HOSTde localhostpara 127.0.0.1e funciona bem:

# settings.py of Django project
...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
},
...
Sirbito X
fonte
4
Seria bom saber o arquivo que você mudou e onde está localizado
Empi
1
Em settings.pydo projeto.
Sirbito X
11

Quando, se você perder o daemon mysql no mac OSx, mas estiver presente em outro caminho, por exemplo, em private / var, execute o seguinte comando

1)

ln -s /private/var/mysql/mysql.sock /tmp/mysql.sock

2) reinicie sua conexão com o mysql com:

mysql -u username -p -h host databasename

funciona também para mariadb

aurny2420289
fonte
9

Execute o cmd abaixo no terminal

/ usr / local / mysql / bin / mysqld_safe

insira a descrição da imagem aqui

Em seguida, reinicie a máquina para entrar em vigor. Funciona!!

Prashanth Sams
fonte
1
Isso funcionou para mim em um iMac executando o High Sierra que havia sido atualizado para o Mojave. O que deve ter acontecido foi que o arquivo mysql.sock estava em tmp e foi excluído na atualização. Como o soquete é criado automaticamente ao iniciar o MySQL, você só precisa garantir que o MySQL esteja desligado e, em seguida, inicie-o no modo de segurança, como acima. O arquivo mysql.sock aparece magicamente.
David
8

Verifique o número de arquivos abertos para o processo mysql usando o comando lsof.

Aumente o limite de arquivos abertos e execute novamente.

hsen
fonte
Eu já deparei com isso antes, e você não poderá fazer isso apenas através do seu arquivo .cnf. talvez você precise ulimitaumentar o número de arquivos abertos que seu cliente e servidor podem abrir. se você estiver em uma versão recente do ubuntu, isso pode exigir a edição do script inicial do mysql em / etc / init, mas espero que você possa fazê-lo no arquivo .cnf.
Underrun
8

Depois de tentar algumas dessas soluções e não ter sucesso, é isso que funcionou para mim:

  1. Reinicie o sistema
  2. mysql.server start
  3. Sucesso!
Mark Lohr
fonte
7

Este pode ser um dos seguintes problemas.

  1. Bloqueio mysql incorreto. solução: Você precisa descobrir o soquete mysql correto,

variáveis ​​mysqladmin -p | soquete grep

e depois coloque-o no seu código de conexão db:

pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")

/tmp/mysql.sock é retornado do grep

2. Solução de porta mysql incorreta: Você precisa descobrir a porta mysql correta:

mysqladmin -p variables | grep port

e depois no seu código:

pymysql.connect(db='db', user='user', passwd='pwd', host='localhost', port=3306)

3306 é a porta retornada do grep

Acho que a primeira opção resolverá o seu problema.

Chamith Malinda
fonte
6

Para quem atualizou de 5,7 para 8,0 via homebrew, esse erro provavelmente é causado pela atualização não concluída. No meu caso, mysql.server startrecebi o seguinte erro:

ERRO! O servidor saiu sem atualizar o arquivo PID

Em seguida, verifiquei o arquivo de log via cat /usr/local/var/mysql/YOURS.err | tail -n 50e descobri o seguinte:

InnoDB: A atualização após uma falha não é suportada.

Se você estiver no mesmo barco, primeiro instale [email protected]via homebrew, pare o servidor e, em seguida, inicie o sistema 8.0 novamente.

brew install mysql@5.7

/usr/local/opt/mysql@5.7/bin/mysql.server start
/usr/local/opt/mysql@5.7/bin/mysql.server stop

Então,

mysql.server start

Isso faria seu MySQL (8.0) funcionar novamente.

Blaszard
fonte
Eu recebo o mesmo ERROR! The server quit without updating PID filenovamente.
28418 awebartisan
No meu caso, eu apenas instalei o [email protected] e removi o mais recente. Tudo começou. Nenhum banco de dados excluído.
Andrew Luca
4

Acho que vi esse mesmo comportamento há algum tempo, mas não consigo me lembrar dos detalhes.
No nosso caso, o problema foi o momento em que o testrunner inicializa as conexões do banco de dados em relação à primeira interação do banco de dados, necessária, por exemplo, pela importação de um módulo em settings.py ou em algum __init__.py. Vou tentar descobrir mais algumas informações, mas isso já pode soar um sinal para o seu caso.

Martin
fonte
4

Verifique se o seu / etc / hosts está 127.0.0.1 localhostnele e deve funcionar bem

hd1
fonte
Surpreendentemente (com respeito) isso resolveu o problema para mim - ao verificar isso, descobri que ao tentar configurar o webdav, o Mavericks havia adicionado algumas linhas adicionais (totalmente ilegíveis) ao meu arquivo host - incluindo uma que redesignou o host local.
precisa saber é o seguinte
4

Eu tenho duas conjecturas sorrateiras neste

CONJETURA Nº 1

Examine a possibilidade de não conseguir acessar o /tmp/mysql.sockarquivo. Quando configuro os bancos de dados MySQL, normalmente deixo o arquivo de soquete entrar /var/lib/mysql. Se você fizer login no mysql como root@localhost, sua sessão do SO precisará acessar a /tmppasta. Verifique se /tmppossui os direitos de acesso corretos no sistema operacional. Além disso, verifique se o usuário sudo sempre pode ler o arquivo/tmp .

CONJETURA # 2

Acessando o mysql via 127.0.0.1 pode causar alguma confusão se você não estiver prestando atenção. Quão?

Na linha de comando, se você se conectar ao MySQL 127.0.0.1, poderá ser necessário especificar o protocolo TCP / IP.

mysql -uroot -p -h127.0.0.1 --protocol=tcp

ou tente o nome DNS

mysql -uroot -p -hDNSNAME

Isso ignorará o login como root@localhost, mas verifique se você temroot@'127.0.0.1' definiu.

Da próxima vez que você se conectar ao MySQL, execute o seguinte:

SELECT USER(),CURRENT_USER();

O que isso te dá?

Se essas funções retornarem com os mesmos valores, você estará se conectando e autenticando conforme o esperado. Se os valores forem diferentes, pode ser necessário criar o usuário correspondente [email protected].

RolandoMySQLDBA
fonte
3

se você receber um erro como abaixo:

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

Então, encontre o local do arquivo mysqld.sock e adicione-o ao "HOST".

Como eu estou usando o xampp no ​​linux, então meu mysqld.sockarquivo está em outro local. então não está funcionando para ' /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' : ''
    }
}
Shyam
fonte
2

Verifique se o seu mysql não atingiu o número máximo de conexões, ou não está em algum tipo de loop de inicialização, como acontece com bastante frequência se as configurações estiverem incorretas no my.cnf.

Use ps aux | grep mysql para verificar se o PID está mudando.

beiller
fonte
2

Procurou on-line por muito tempo para não contribuir. Depois de tentar digitar o prompt do mysql na linha de comando, continuei recebendo esta mensagem:

ERRO 2002 (HY000): Não é possível conectar ao servidor MySQL local através do soquete '/tmp/mysql.sock' (2)

Isso ocorreu porque meu servidor mysql local não estava mais em execução. Para reiniciar o servidor, naveguei para

shell> cd /user/local/bin

onde meu mysql.server estava localizado. A partir daqui, basta digitar:

shell> mysql.server start

Isso irá reiniciar o servidor mysql local.

A partir daí, você pode redefinir a senha root, se necessário.

mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
->                   WHERE User='root';
mysql> FLUSH PRIVILEGES;
preynolds
fonte
2

Eu tive que eliminar todas as instâncias do mysql encontrando primeiro todos os IDs do processo:

ps aux | grep mysql

E então matando-os:

mata -9 {pid}

Então:

mysql.server start

Trabalhou para mim.

HomerPlata
fonte
1

O soquete está localizado em / tmp. No sistema Unix, devido a modos e propriedades em / tmp, isso pode causar algum problema. Mas, desde que você nos diga que PODE usar sua conexão mysql normalmente, acho que não é um problema no seu sistema. Uma verificação primária deve ser realocar o mysql.sock em um diretório mais neutro.

O fato de o problema ocorrer "aleatoriamente" (ou não toda vez) permite-me pensar que poderia ser um problema no servidor.

  • O seu / tmp está localizado em um disco padrão ou em uma montagem exótica (como na RAM)?

  • Seu / tmp está vazio?

  • Será que iotopmostrar algo errado quando você encontrar o problema?

Koreth
fonte
0

Configure sua conexão com o banco de dados na caixa de diálogo 'Gerenciar conexões com o banco de dados. Selecione 'Padrão (TCP / IP)' como método de conexão.

Consulte esta página para obter mais detalhes http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

De acordo com esta outra página, um arquivo de soquete é usado mesmo se você especificar localhost.

Um arquivo de soquete Unix é usado se você não especificar um nome de host ou se especificar o nome de host especial localhost.

Também mostra como verificar seu servidor executando estes comandos:

Se um processo mysqld estiver em execução, você pode verificá-lo, tentando os seguintes comandos. O número da porta ou o nome do arquivo de soquete Unix pode ser diferente em sua configuração. host_ip representa o endereço IP da máquina em que o servidor está sendo executado.

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
Só você
fonte
0

no ubuntu14.04, você pode fazer isso para resolver esse problema.

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=
ZackZang
fonte
0

Para mim, tenho certeza que o mysqld foi iniciado e a linha de comando mysql pode funcionar corretamente. Mas o servidor httpd mostra o problema (não é possível conectar ao mysql pelo soquete).

Comecei o serviço com mysqld_safe &.

finalmente, descobri que quando inicio o serviço mysqld com o serviço mysqld start, há problemas (problema de permissão do selinux) e, quando corrigo o problema do selinux e inicio o mysqld com "service mysqld start", o problema da conexão httpd desaparece. Mas quando inicio o mysqld com mysqld_safe &, o mysqld pode ser trabalhado. (o cliente mysql pode funcionar corretamente). Mas ainda há problemas ao conectar com o httpd.

Robin LI
fonte
0

Se estiver relacionado ao soquete, leia este arquivo

/etc/mysql/my.cnf

e veja qual é o local padrão do soquete. É uma linha como:

socket = /var/run/mysqld/mysqld.sock

Agora crie um alias para seu shell como:

alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"

Dessa forma, você não precisa de privilégios de root.

MaxV
fonte
0

Simplesmente tente executar mysqld .

Era isso que não estava funcionando para mim no mac. Se não funcionar, tente /usr/local/var/mysql/<your_name>.errver os logs de erro detalhados.

eloone
fonte
0
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

Pode ser útil.

陈 也在 哦
fonte
O mesmo que a resposta mais destacada 'sudo /usr/local/mysql/support-files/mysql.server start', mas sistemas operacionais diferentes podem ter um caminho diferente do 'mysql.server'. Então tentei escrever uma linha de comando que pode ser útil em muitos sistemas operacionais.
陈也在哦
0

Usando o MacOS Mojave 10.14.6 para MySQL 8.0.19 instalado via Homebrew

  • Correu sudo find / -name my.cnf
  • Arquivo encontrado em /usr/local/etc/my.cnf

Trabalhou por um tempo e, eventualmente, o erro retornou. Desinstalou a versão Homebrew do MySQL e instalou o arquivo .dmg diretamente daqui

Felizmente conectando desde então.

Paciência Mpofu
fonte
0

No meu caso, o que ajudou foi editar o arquivo /etc/mysql/mysql.conf.d/mysqld.cnfe substituir a linha:

socket      = /var/run/mysqld/mysqld.sock

com

socket      = /tmp/mysql.sock

Então eu reiniciei o servidor e funcionou bem. O engraçado é que se eu recolocasse a linha como estava antes e reiniciei, ainda funcionaria ..

jav
fonte
0

Eu tinha enfrentado problemas semelhantes recentemente. Passou por muitas respostas. Comecei a trabalhar seguindo as etapas.

  1. altere o caminho do soquete em /etc/my.cnf (como eu estava repetidamente recebendo erros com /tmp/mysql.sock) para alterar o caminho do soquete
  2. execute mysqld_safe para reiniciar o servidor, pois é a maneira recomendada de reiniciar em caso de erros. referência a mysqld_safe
Arjun KR
fonte
0

Para mim, o servidor mysql não estava em execução. Então, eu iniciei o servidor mysql através

mysql.server start

então

mysql_secure_installation

para proteger o servidor e agora posso visitar o servidor MySQL através

sudo mysql -uroot -p

sh6210
fonte