¿Cómo obligar a MySQL a conectarse por TCP en lugar de un socket Unix?

46

Me gustaría analizar el mysqltráfico. En este momento, todas las solicitudes mysql se envían al socket MySQL unix:

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

Estoy tratando de deshabilitar ese socket para forzar a MySQL a usar el socket de red en su lugar en el loopback. Probé comentando todas las socketdirectivas en el my.cnfy debian.cnfarchivos y reiniciarse MySQL, pero no había ninguna diferencia.

¿Cómo puedo desactivar el socket MySQL unix para forzar MySQL a través de la red?

Otros detalles: estoy corriendo MySQL 5.1en ubuntu 10.04.

Precisiones sobre la pregunta
Dado que muchas personas sugirieron habilitar el zócalo de red, me gustaría aclarar mi pregunta señalando que la dirección de enlace ya estaba habilitada bind-address = 127.0.0.1y que hay una conexión de escucha disponible:

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

Todavía no veo ningún intento de conexión 127.0.0.1:3306desde mi aplicación web (sitio web de Drupal).

Actualizado con la respuesta

De hecho, parece que el problema proviene del mysqliconector que utiliza Drupal ( .ht_config.phppara aquellos que estén interesados). Se configuró: mysqli://drupal:***@localhost/drupalcambiando localhosta 127.0.0.1solucionado el problema (es decir, Drupal ahora está haciendo conexiones al zócalo de red).

Max
fuente

Respuestas:

52

Utilice un enlace de IP para 127.0.0.1. Eso debería activar un puerto de escucha localhost. En el lado del cliente no use localhost, use 127.0.0.1en su lugar. Muchos clientes tienen un alias interno que los hace conectarse al socket si lo especifica localhostcomo destino.

MySQL es extraño.

Nils
fuente
66
Solo usa --protocol... mira la respuesta de Jonathan.
Pacerier
76

En Linux y otros * nixes, MySQL asumirá que desea utilizar un socket si se conecta al host "localhost" (que sería el nombre de host predeterminado).

Puede anular esto de 3 maneras: 1) Especifique un nombre de host diferente como 127.0.0.1 ( mysql -h 127.0.0.1) o el nombre de host real de su servidor 2) Especifique que desea usar TCP y no un socket ( mysql --protocol tcp)

También puede hacer que el valor predeterminado sea mi edición de my.cnf para que tenga esto ([cliente] significa cualquier cliente:

[client]
protocol=tcp

Puede ver la descripción completa de cómo MySQL decide cómo conectarse aquí:

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

Jonathan Enmienda
fuente
66
Esta debería ser la respuesta aceptada.
Pacerier
¿Ejecutar el servidor MySQL dentro de un contenedor Docker con docker-compose con el uso del nombre del contenedor como su nombre de host obliga al uso del protocolo de red sobre un protocolo de socket?
Stephane
definitivamente debería ser la respuesta aceptada. La forma 3 (protocolo = tcp en my.cnf) es la única forma que funciona sin ningún parámetro adicional de la línea de comandos, por lo que funciona sin cambios en ningún script.
Tuncay Göncüoğlu
16

¿No es realmente un problema del cliente? Si usa el programa mysql Puede usar el --protocolinterruptor. Desde la página del 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”.

Acabo de intentar

mysql --protocol=TCP -u root -p

mientras monitorizo ​​el puerto 3306 con tcpdump -i lo tcp port 3306y puedo ver el tráfico, mientras que si solo ejecuto

mysql  -u root -p

(Correctamente) no veo tráfico en el puerto 3306.

EDITAR:

Ahora que nos dice que está usando DRUPAL, la solución es relativamente fácil.

Ve sites/<sitename>o sites/defaultedita el settings.phparchivo

Encontrarás una estructura como esta

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

Cambie 'localhost'a '127.0.0.1'y guarde el archivo.

Iain
fuente
De hecho, podría deberse a un problema del cliente, pero dado que el cliente es una aplicación web (Drupal) y no tengo control sobre él, estaba buscando una forma de forzarlo desde el punto de vista del sistema.
Max
1
bueno al decir no controlque estaba siendo dramático. Podría modificar el .ht_config.phparchivo y solucionar el problema.
Max
Tal vez un poco dramático, pero es un problema del cliente y se resuelve fácilmente. Mira mi edición.
user9517 es compatible con GoFundMonica el
Lo siento, actualicé mi pregunta con la respuesta después de agregar mi comentario. Por alguna razón estamos usando en .ht_config.phplugar de settings.php. No sé por qué (el equipo de desarrollo solicitó que debería ser así). Ahora el problema es que Drupal parece estar leyendo el .ht_config.phparchivo en cada solicitud (porque si lo cambio, los cambios se tienen en cuenta de inmediato), lo que no puede ayudar con las actuaciones. Buscaremos una forma de almacenar en caché esas configuraciones en la capa de aplicación, pero ese es un problema diferente.
Max
Nota: no puedes hacerlo --protocol=socketsi tienes una hostentrada en la [client]sección de la .my.cnfque da wrong or unknown protocolerror. (mysql 5.7.13)
Kris
1

Edite my.cnf y agregue la directiva

bind-address = 127.0.0.1

o su IP preferida para que sea accesible a través de la red. Reinicie mysql después para que funcione.

Chris
fuente
1

El cliente php mysqli utilizará el archivo de socket Unix en lugar de la red tcp cuando pase el valor NULO o la cadena "localhost" ( http://www.php.net/manual/en/mysqli.construct.php )

parece que el cliente sqlyog siempre usa la red tcp incluso cuando llena "localhost" en ella

diyism
fuente
0

Tuve que eliminar /etc/my.cnf (después de hacer una copia de seguridad), luego reinicié el servidor. Entonces pude conectarme con un enchufe y el error desapareció.

robrecord
fuente