Come forzare MySQL a connettersi tramite TCP anziché un socket Unix?


46

Vorrei analizzare il mysqltraffico. In questo momento, tutte le richieste mysql vengono inviate al socket unix di MySQL:

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

Sto cercando di disabilitare quel socket per forzare MySQL a utilizzare il socket di rete invece sul loopback. Ho provato commentando tutte le socketdirettive in my.cnfe debian.cnffile ed ho ricominciato MySQL, ma non faceva alcuna differenza.

Come posso disabilitare il socket unix di MySQL per forzare MySQL sulla rete?

Informazioni aggiuntive: Io corro MySQL 5.1su ubuntu 10.04.

Precauzioni sulla domanda
Poiché molte persone hanno suggerito di abilitare il socket di rete, vorrei chiarire la mia domanda sottolineando che l'indirizzo di bind era già abilitato bind-address = 127.0.0.1e che era disponibile una connessione di ascolto:

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

Ancora non vedo tentativi di connessione 127.0.0.1:3306provenienti dal mio webapp (sito Web Drupal).

Aggiornato con la risposta

Sembra davvero che il problema provenga dal mysqliconnettore utilizzato da Drupal ( .ht_config.phpper quelli che sono interessati). È stato impostato mysqli://drupal:***@localhost/drupal:, cambiando localhostper 127.0.0.1risolvere il problema (ovvero Drupal sta ora effettuando connessioni al socket di rete).

Risposte:


52

Utilizzare un'associazione IP a 127.0.0.1. Ciò dovrebbe attivare una porta di ascolto attivata localhost. Sul lato client non utilizzare localhost: utilizzare 127.0.0.1invece. Molti client hanno un alias interno che li rende connessi al socket se si specifica localhostcome destinazione.

MySQL è strano.


6
Usa solo --protocol.. vedi la risposta di Jonathan.
Pacerier,

76

In Linux e altri * nix, MySQL supporrà di voler utilizzare un socket se ci si connette all'host "localhost" (che sarebbe il nome host predefinito).

È possibile sovrascriverlo in 3 modi: 1) Specificare un nome host diverso come 127.0.0.1 ( mysql -h 127.0.0.1) o il nome host reale del server 2) Specificare che si desidera utilizzare TCP e non un socket ( mysql --protocol tcp)

Puoi anche fare in modo che l'impostazione predefinita my modifichi my.cnf in modo che abbia questo ([client] significa qualsiasi client:

[client]
protocol=tcp

Puoi vedere la descrizione completa di come MySQL decide come connettersi qui:

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


6
Questa dovrebbe essere la risposta accettata.
Pacerier,

L'esecuzione del server MySQL all'interno di un contenitore Docker con docker-compose con l'uso del nome del contenitore come nome host impone l'uso del protocollo di rete su un protocollo socket?
Stephane,

sicuramente dovrebbe essere la risposta accettata. way 3 (protocol = tcp in my.cnf) è l'unico modo che funziona senza parametri di riga di comando aggiuntivi, quindi funziona senza cambiamenti in nessuno script.
Tuncay Göncüoğlu,

16

Non è davvero un problema del cliente? Se si utilizza il programma mysql È possibile utilizzare l' --protocolinterruttore. Dalla pagina 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”.

Ci ho appena provato

mysql --protocol=TCP -u root -p

mentre monitoro la porta 3306 con tcpdump -i lo tcp port 3306e posso vedere il traffico mentre se solo corro

mysql  -u root -p

Non vedo (correttamente) traffico sulla porta 3306.

MODIFICARE:

Ora che ci dici che stai usando DRUPAL, la soluzione è relativamente semplice.

Vai a sites/<sitename>o sites/defaulte modifica il settings.phpfile

Troverai una struttura come questa

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

Cambia 'localhost'in '127.0.0.1'e salva il file.


potrebbe davvero da un problema del client, ma poiché il client è un'applicazione web (Drupal) e non ho alcun controllo su di esso, stavo cercando un modo per forzarlo dal punto di vista del sistema.
Max

1
bene dicendo no controlche ero drammatico. Potrei modificare il .ht_config.phpfile e risolvere il problema.
Max

Un po 'drammatico forse ma è un problema del cliente ed è facilmente risolvibile. Vedi la mia modifica.
user9517 supporta GoFundMonica il

Spiacenti, ho aggiornato la mia domanda con la risposta dopo aver aggiunto il mio commento. Per qualche ragione stiamo usando .ht_config.phpinvece di settings.php. Non so perché (il team di sviluppo ha richiesto che dovrebbe essere così). Ora il problema è che Drupal sembra leggere il .ht_config.phpfile su ogni richiesta (perché se lo cambio, le modifiche vengono immediatamente prese in considerazione) che non può aiutare con le prestazioni. Cercheremo un modo per memorizzare tali impostazioni a livello di applicazione, ma questo è un problema diverso.
Max

Nota: non puoi farlo --protocol=socketse hai una hostvoce nella [client]sezione .my.cnfche dà wrong or unknown protocolerrore. (mysql 5.7.13)
Kris


1

Modifica my.cnf e aggiungi la direttiva

bind-address = 127.0.0.1

o il tuo IP preferito per renderlo accessibile tramite la rete. Riavvia mysql dopo per farlo funzionare.



0

Ho dovuto eliminare /etc/my.cnf (dopo averne eseguito il backup), quindi ho riavviato il server. Quindi ho potuto connettermi con un socket e l'errore è scomparso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.