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

23

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

Estou executando o Mac OS X Lion, o apache2 integrado, 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)
    
por dcolumbus 29.07.2011 / 00:11

10 respostas

23

O MySQL tentará se conectar ao soquete unix se você disser para se conectar ao "localhost". Se você disser para se conectar ao 127.0.0.1, você está forçando-o a se conectar ao soquete da rede. Então, provavelmente você tem o MySQL configurado para escutar apenas o soquete da rede e não o soquete do sistema de arquivos.

O que exatamente está errado com o 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: Baseado 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 contém mais algumas informações.

Aqui você tem o começo 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.

    
por 29.07.2011 / 00:43
8

Você pode ter o IPv6 ativado, seu próprio localhost é resolvido para o localhost ipv6, que não está definido em sua configuração msql.

ive também teve um problema onde eu tive que adicionar 'localhost' no lugar de '127.0.0.1' para as sub-redes permitidas para esse usuário, não entendo o porquê (eu estava usando o ipv4 e foi há um tempo atrás) mas vale a pena uma tentativa.

    
por 29.07.2011 / 00:37
5

Para mim, o PHP embutido do OSX é configurado para usar um socket unix diferente do mysql do homebrew. Assim, não é possível conectar via host local, que utiliza esse soquete.

Eu consertei com um hack rápido ao configurar o caminho de 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 socket padrão usados pelo php e pelo mysql:

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

Conecte-se 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 socket o cliente mysql está usando para conectar:

lsof | egrep '^mysql .*(IPv|unix)'
    
por 16.08.2015 / 01:28
2

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

Na verdade, eu tive um problema semelhante há algum tempo (apesar de não estar no OSx), então achei que valeria a pena.

    
por 29.07.2011 / 00:38
2

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

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

Cuidado, dependendo de qual driver você usa, você pode ter que especificar o pdo_mysql.default_socket = !

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

select @@datadir;
    
por 17.02.2017 / 11:29
1

O localhost está definido no seu arquivo /private/etc/hosts ?

    
por 29.07.2011 / 00:13
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 de 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á automaticamente todos, já que o MySQL os 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 variável skip_name_resolve :

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 é OFF e 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á para conectar você como 'root'@'localhost' .

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

Primeiro, gostaria de verificar as 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 o skip_name_resolve : mysql> show variables like 'skip_name_resolve';

Se for ON , eu descobriria onde está sendo definido (por exemplo /etc/my.cnf ) e removê-lo, a menos que seja necessário.

Espero que isso ajude você!

    
por 03.08.2011 / 23:06
1

Eu estava tendo esse problema e não consegui entender. Eu tentei tudo que eu poderia muito bem sem sucesso.

Descobri que eu tinha um .netrc em / root / que continha informações.

Eu deletei e o problema desapareceu.

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

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

    
por 06.04.2013 / 21:51
0

você tem que defini-lo em private / etc / hosts, eu acho ... ou apenas use 127.0.0.1 porque é a mesma coisa, apenas um alias.

    
por 29.07.2011 / 00:14
0

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
    
por 12.01.2014 / 09:41