¿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).

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.


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


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.


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.



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ó.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.