Como forçar o MySQL a se conectar por TCP ao invés de um socket Unix?

37

Gostaria de analisar o tráfego mysql . Agora, todas as solicitações mysql são enviadas para o soquete unix do MySQL:

unix  2      [ ACC ]     STREAM     LISTENING     3734388  15304/mysqld        /var/run/mysqld/mysqld.sock

Estou tentando desativar esse soquete para forçar o MySQL a usar o soquete de rede no loopback. Eu tentei comentar todas as diretivas socket nos arquivos my.cnf e debian.cnf e reiniciei o MySQL, mas não fez diferença alguma.

Como posso desabilitar o soquete unix do MySQL para forçar o MySQL pela rede?

informações adicionais: estou executando MySQL 5.1 on ubuntu 10.04 .

Precisões na questão
Como muitas pessoas sugeriram ativar o soquete de rede, gostaria de esclarecer minha dúvida apontando que o endereço de associação já estava habilitado com bind-address = 127.0.0.1 e que uma conexão de escuta está disponível:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      15601/mysqld 

Ainda não vejo nenhuma tentativa de tentativa de 127.0.0.1:3306 vindo da minha webapp (site do Drupal).

Atualizado com a resposta

Parece que o problema está vindo do conector mysqli que o Drupal usa (em .ht_config.php para quem está interessado). Foi definido: mysqli://drupal:***@localhost/drupal , a alteração de localhost para 127.0.0.1 corrigiu o problema (por exemplo, o Drupal está agora fazendo conexões com o soquete de rede).

    
por Max 05.12.2011 / 18:42

7 respostas

44

Use uma ligação de IP para 127.0.0.1 . Isso deve ativar uma porta de escuta em localhost . No lado do cliente, não use localhost - use 127.0.0.1 . Muitos clientes possuem um alias interno que os faz se conectar ao soquete se você especificar localhost como destino.

O MySQL é estranho.

    
por 05.12.2011 / 20:00
64

No Linux e outros * nixes, o MySQL assumirá que você deseja usar um soquete se conectar ao host "localhost" (que seria o nome do host padrão).

Você pode substituir isso de três maneiras: 1) Especifique um hostname diferente como 127.0.0.1 ( mysql -h 127.0.0.1 ) ou o hostname real do seu servidor 2) Especifique que você deseja usar o TCP e não um soquete ( mysql --protocol tcp )

Você também pode facilmente tornar o padrão meu editando seu my.cnf para que ele tenha isso ([cliente] significa qualquer cliente:

[client]
protocol=tcp

Você pode ver a descrição completa de como o MySQL decide como se conectar aqui:

link

    
por 05.12.2011 / 23:29
13

Este não é realmente um problema do cliente? Se estiver usando o programa mysql, você pode usar a opção --protocol . Da página man

 --protocol={TCP|SOCKET|PIPE|MEMORY}

       The connection protocol to use for connecting to the server. It is
       useful when the other connection parameters normally would cause a
       protocol to be used other than the one you want. For details on the
       allowable values, see Section 4.2.2, “Connecting to the MySQL
       Server”.

Eu apenas tentei

mysql --protocol=TCP -u root -p

enquanto monitora a porta 3306 com tcpdump -i lo tcp port 3306 e eu posso ver o tráfego, enquanto se eu apenas executar

mysql  -u root -p

Eu (corretamente) não vejo tráfego na porta 3306.

EDITAR:

Agora que você nos diz que está usando o DRUPAL, a solução é relativamente fácil.

Acesse sites/<sitename> ou sites/default e edite o arquivo settings.php

Você encontrará uma estrutura como essa

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'databasename',
      'username' => 'databaseuser',
      'password' => 'databasepassword',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

Altere o 'localhost' para '127.0.0.1' e salve o arquivo.

    
por 06.12.2011 / 12:19
1

Isso pode soar um pouco maluco

Tente definir o arquivo de soquete como um caminho absoluto cujo caminho reside em outra máquina

link

Caso contrário, você não pode ignorar este comportamento padrão porque um arquivo de soquete deve existir para o mysqld se comunicar.

    
por 05.12.2011 / 19:14
1

Edite o my.cnf e adicione a diretiva

bind-address = 127.0.0.1

ou seu IP preferido para torná-lo acessível pela rede. Reinicie o mysql depois para fazê-lo funcionar.

    
por 05.12.2011 / 23:42
1

O php mysqli client usará o arquivo socket unix ao invés da rede tcp quando você passar o valor NULL ou a string "localhost" ( link )

parece que o cliente sqlyog sempre usa a rede tcp mesmo quando você preenche "localhost" nele

    
por 12.10.2012 / 06:15
0

Eu tive que excluir /etc/my.cnf (depois de fazer o backup), então reiniciei o servidor. Então eu poderia conectar com um soquete e o erro desapareceu.

    
por 29.10.2016 / 16:46