O MySQL não pode se conectar via "localhost", apenas 127.0.0.1

27

isso é um mistério para mim. A única maneira de me conectar ao MySQL é se eu chamá-lo via "127.0.0.1" ... por exemplo, meu script de conexão PHP NÃO funcionará com o localhost

Estou executando o Mac OS X Lion, apache2 embutido, MySQL, PHP, phpMyAdmin

mysqladmin:

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)
dcolumbus
fonte
1
Provavelmente isso é mais por falha do servidor, mas verifique se o arquivo hosts possui o alias localhost.
Matt
127.0.0.1 localhost está no meu arquivo hosts.
28411 dcolumbus
Abra o prompt de comando, digite ping localhoste veja o que diz.
27611 Steve Robbins
64 bytes de 127.0.0.1: icmp_seq = 0 ttl = 64 time = 0.100 ms 64 bytes de 127.0.0.1: icmp_seq = 1 ttl = 64 time = 0.102 ms 64 bytes de 127.0.0.1: icmp_seq = 2 ttl = 64 time = 0.096 ms
dcolumbus

Respostas:

26

O MySQL tentará se conectar ao soquete unix se você solicitar que se conecte ao "localhost". Se você solicitar que ele se conecte ao 127.0.0.1, você o está forçando a se conectar ao soquete de rede. Portanto, provavelmente você tem o MySQL configurado para ouvir apenas o soquete da rede e não o soquete do sistema de arquivos.

O que exatamente está errado com seu soquete unix é difícil de dizer. Mas eu recomendo que você leia esta página no guia de referência do MySQL. Isso deve ajudá-lo.

ATUALIZAÇÃO: Com base na pergunta atualizada: O parâmetro "socket" deve ser algo como isto: "/var/lib/mysql/mysql.sock". Esta página no Manual de referência tem mais algumas informações.

Aqui você tem o início do meu arquivo /etc/my.cnf:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

Seu arquivo deve ser semelhante. Então seu problema deve ser resolvido. Não esqueça de reiniciar o servidor MySQL antes de testá-lo.

Raffael Luthiger
fonte
1
Wow: "Um arquivo de soquete Unix será usado se você não especificar um nome de host ou se especificar o nome de host especial localhost." Isso parece ... não intuitivo. Daí todas as outras respostas.
Mark Wagner
Isso é bom saber +1
Matt
Eu aprecio a teoria ... só não sei qual é a resposta.
dcolumbus
@columbus: Como eu já escrevi, é difícil dizer. O que posso recomendar é abrir um console e simplesmente escrever o comando "mysql". Talvez você obtenha mais informações então. Outra coisa é olhar para o arquivo de log. O meu está localizado no diretório / var / log / e é chamado mysql.log. O seu poderia ter outro nome ou outro local. Se você puder nos fornecer mais informações, provavelmente poderemos ajudá-lo melhor.
Raffael Luthiger 30/07
2
O php.ini tem referências a "/var/mysql/mysql.sock" (3 lugares para ser exato) que precisam ser alterados para "/tmp/mysql.sock" ... Obrigado por sua ajuda!
dcolumbus 3/08
8

Você pode ter o IPv6 ativado, seu host local muito possível é resolvido para o host local ipv6, que não está definido na sua configuração do msql.

Eu também tive um problema em que eu tive que adicionar 'localhost' no lugar de '127.0.0.1' às sub-redes permitidas para esse usuário, não entendo o porquê (eu estava usando o ipv4 e isso foi há algum tempo), mas vale a pena tentar.

Silverfire
fonte
Você pode verificar isso vendo se 'host localhost' na linha de comando retorna :: 1, assim como 127.0.0.1. Se assim for, você pode remover o :: 1 mapeamento de / / etc / hosts privados ou MySQL reconfigure para escutar o IPv6 :: 1 endereço, bem como 127.0.0.1
David North
Acho que lembro de ler em algum lugar que o IPv6 está ativado por padrão no Mac OS X ... é esse o caso?
28411 dcolumbus
Atualmente, o ipv6 está habilitado para praticamente todos os sistemas operacionais modernos, no osx10.6 e ativado por padrão.
Silverfire 29/07
errado. Localhost tem um significado especial para clientes mysql - confira serverfault.com/a/295300/67675
poige
5

Para mim, o php embutido no OSX está configurado para usar um soquete unix diferente do mysql do homebrew. Portanto, ele não pode se conectar via localhost, que utiliza esse soquete.

Corrigi-o com um hack rápido, simbolizando o caminho do soquete configurado do php para apontar para o que o mysql realmente usa.

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

Os seguintes comandos de diagnóstico foram muito úteis.

Verifique os caminhos de soquete padrão usados ​​pelo php e mysql:

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

Conecte usando um soquete especificado:

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

Determine que tipo de cliente mysql de soquete está usando para conectar:

lsof | egrep '^mysql .*(IPv|unix)'
soliton_zero
fonte
2

Você poderia verificar mysql/conf/my.conf(a estrutura de diretórios deve ser praticamente a mesma no OSx) para ver se não skip-networkingé comentada? Nesse caso, adicione um #na frente da linha e reinicie o servidor mysql.

Na verdade, tive um problema semelhante há um tempo (embora isso não estivesse no OSx), então pensei que valeria a pena tentar.

karllindmark
fonte
1
Por que isso foi rebaixado? Uma explicação seria útil.
31411 karllindmark
Não votei em voto negativo, mas sua resposta é na verdade o oposto do que o OP está pedindo. Mas votei em você porque lutei com a condição oposta - conectaria através de um soquete, mas NÃO via rede. A propósito, NÃO PODERIA corrigir isso através do my.conf; Eu tive que colocá-lo na linha de comando: "mysqlf --skip_networking = 0 ..."
Jan Steinman
2

O PHP ainda está tentando usar o local padrão do soquete. Esse problema pode aparecer se você tiver movido a pasta MariaDB / MySQL de / var / lib / mysql para outro local. Para resolver o problema, você precisa definir a localização do novo soquete no arquivo /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

Cuidado, dependendo do driver que você usa, pode ser necessário especificar pdo_mysql.default_socket = !

Para verificar seu diretório atual, execute o seguinte comando no mysql:

select @@datadir;
joelschmid
fonte
1

O localhost está definido no seu /private/etc/hostsarquivo?

Justin ᚅᚔᚈᚄᚒᚔ
fonte
127.0.0.1 localhost está no meu arquivo hosts.
28411 dcolumbus
4
/private? Nunca vi isso antes
TheLQ 29/07
@TheLQ: É uma coisa do Mac. Enquanto não é um link simbólico do / etc para / private / etc, por algum motivo, a Apple geralmente aconselha a usar o caminho "verdadeira": support.apple.com/kb/TA27291
Justin ᚅᚔᚈᚄᚒᚔ
1

Consegui recriar seus mesmos sintomas na minha caixa de teste, espero que isso ajude.

No MySQL, os usuários são definidos por duas partes (nome e host). Por padrão, o MySQL terá 3 usuários root:

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

O campo da senha ficará em branco (sem senha) ou terá um hash armazenado. Se você definir a senha para um usuário específico, ele não atualizará tudo automaticamente, pois o MySQL as vê como usuários diferentes.

Por exemplo:

mysql> set password for 'root'@'127.0.0.1' = password('Password');

atualizará a senha para 'root'@'127.0.0.1', mas não 'root'@'localhost'ou'root'@'localhost.localdomain'

Dê uma olhada na skip_name_resolvevariável:

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

Por padrão , skip_name_resolveé OFFe tentará resolver todos os endereços IP para nomes de host. Por exemplo, se você se conectar como 'root'@'127.0.0.1', o MySQL mudará se conectar como 'root'@'localhost'.

Se for ON, o MySQL verá e se conectará 'root'@'127.0.0.1'e 'root'@'localhost'como usuários separados. E eles podem ou não ter senhas diferentes, dependendo de como foram definidas.


Então, primeiro, gostaria de verificar se há diferenças de senha: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

Se houver, você pode corrigi-los ou continuar investigando.

Então eu verificaria skip_name_resolve: mysql> show variables like 'skip_name_resolve';

Se estiver ON, eu descobriria onde está sendo definido (por exemplo /etc/my.cnf) e o removeria, a menos que haja necessidade.

Espero que isso ajude você!

pferate
fonte
1

Eu estava tendo esse problema e não consegui descobrir. Tentei tudo o que pude, sem sucesso.

Eu descobri que tinha um .netrc em / root / que continha informações.

Eu o apaguei e o problema desapareceu.

Capaz de efetuar login no mysql usando mysql -uroot -p sem problemas agora.

Eu sei que este é um post antigo, mas espero que isso ajude alguém.

Terry
fonte
1

Para mim, alterar as permissões para serem publicamente legíveis no diretório pai do mysql.sock corrigiu o problema:

chmod 755 /var/lib/mysql
zmonteca
fonte
1

Para pessoas que estão usando o CageFS com CloudLinux:

Recriei /var/lib/mysqlporque estava reconstruindo o servidor MySQL do zero ...

que desmontou o caminho dos cagefs. Sei que não está relacionado, mas estava usando o cPanel e o CloudLinux. Não pude verificar por que a conexão do soquete não funcionaria e, finalmente, percebi.

adicionando /var/lib/mysqla /etc/cagefs/cagefs.mp (se já houver, prossiga para a próxima etapa) e executando

cagefsctl --remount-all

corrigiu o problema

Luka
fonte
1
AMD! Foi isso que o corrigiu para mim! Ele já estava dentro, /etc/cagefs/cagefs.mpmas estava sendo executado cagefsctl --remount-all. Valeu cara!
Alvaro Flaño Larrondo
0

você tem que defini-lo em privado / etc / hosts, eu acho ... ou apenas usar 127.0.0.1, porque é a mesma coisa de qualquer maneira, apenas um alias.

Shackrock
fonte
127.0.0.1 localhost está no meu arquivo hosts.
28411 dcolumbus