Como forçar o MySQL a se conectar por TCP em vez de um soquete Unix?

46

Eu gostaria de analisar o mysqltráfego. No momento, todas as solicitações mysql são enviadas para o soquete do MySQL unix:

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 em vez do loopback. Eu tentei comentar a todas as socketdirectivas no my.cnfe debian.cnfarquivos e reiniciado MySQL, mas isso não fez diferença.

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

Informação adicional: Eu estou correndo MySQL 5.1em ubuntu 10.04.

Precisões sobre a pergunta
Como muitas pessoas sugeriram a ativação do soquete de rede, gostaria de esclarecer minha pergunta apontando que o endereço de ligação já estava ativado bind-address = 127.0.0.1e 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 conexão 127.0.0.1:3306vinda do meu aplicativo da web (site do Drupal).

Atualizado com a resposta

Parece realmente que o problema vem do mysqliconector que o Drupal usa ( .ht_config.phppara aqueles que estão interessados). Foi definido mysqli://drupal:***@localhost/drupal:, alterando localhostpara 127.0.0.1corrigir o problema (ou seja, o Drupal agora está fazendo conexões com o soquete de rede).

Máx.
fonte

Respostas:

52

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

MySQL é estranho.

Nils
fonte
6
Apenas use --protocol... veja a resposta de Jonathan.
Pacerier
75

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

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

Você também pode facilmente fazer com que o padrão seja editar meu my.cnf para que ele possua isso ([client] significa qualquer cliente:

[client]
protocol=tcp

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

http://dev.mysql.com/doc/refman/5.5/en/connecting.html

Jonathan Amend
fonte
6
Essa deve ser a resposta aceita.
Pacerier
A execução do servidor MySQL dentro de um contêiner do Docker com docker-compose com o uso do nome do contêiner, já que o nome do host força o uso do protocolo de rede sobre um protocolo de soquete?
Stephane
definitivamente deve ser a resposta aceita. A maneira 3 (protocol = tcp em my.cnf) é a única maneira que funciona sem nenhum parâmetro adicional da linha de comando, portanto funciona sem alterações em nenhum script.
Tuncay Göncüoğlu
16

Isso não é realmente um problema do cliente? Se estiver usando o programa mysql, você pode usar o --protocolswitch. Na página do manual

 --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 3306e posso ver o tráfego, enquanto se eu apenas corro

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.

Vá para sites/<sitename>ou sites/defaultedite o settings.phparquivo

Você encontrará uma estrutura como esta

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

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

Iain
fonte
poderia de fato por um problema do cliente, mas como o cliente é um aplicativo da Web (Drupal) e eu não tenho controle sobre ele, estava procurando uma maneira de forçá-lo do ponto de vista do sistema.
Max
1
bem, dizendo que no controleu estava sendo dramático. Eu poderia modificar o .ht_config.phparquivo e corrigir o problema.
Max
Um pouco dramático, talvez, mas é um problema do cliente e é facilmente resolvido. Veja minha edição.
user9517 suporta GoFundMonica
Desculpe, atualizei minha pergunta com a resposta depois de adicionar meu comentário. Por alguma razão, estamos usando em .ht_config.phpvez de settings.php. Não sei por que (a equipe de desenvolvimento solicitou que fosse assim). Agora, a questão é que o Drupal parece estar lendo o .ht_config.phparquivo em cada solicitação (porque, se eu mudar, as alterações são imediatamente levadas em conta), o que não pode ajudar nas performances. Estaremos procurando uma maneira de armazenar em cache essas configurações na camada do aplicativo, mas esse é um problema diferente.
Max
Nota: você não pode fazer --protocol=socketse você tem uma hostentrada na [client]seção .my.cnfwrong or unknown protocolerro. (mysql 5.7.13)
Kris
1

Isso pode parecer um pouco louco

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

http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_socket

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

RolandoMySQLDBA
fonte
1

Edite o my.cnf e adicione a diretiva

bind-address = 127.0.0.1

ou seu IP preferido para torná-lo acessível através da rede. Reinicie o mysql depois para que ele funcione.

Chris
fonte
1

O cliente php mysqli usará o arquivo de soquete unix em vez da rede tcp quando você passar o valor NULL ou a string "localhost" ( http://www.php.net/manual/en/mysqli.construct.php )

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

diyism
fonte
0

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

robrecord
fonte