MySQL non può connettersi tramite "localhost", solo 127.0.0.1


27

questo è un po 'un mistero per me. L'unico modo in cui posso collegarmi a MySQL è se lo chiamo tramite "127.0.0.1" ... ad esempio, il mio script PHP connect NON funzionerà con localhost

Sono in esecuzione Mac OS X Lion, apache2 integrato, MySQL, PHP, phpMyAdmin

mysqladmin:

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)

1
Questo è probabilmente più per errore del server, ma assicurati che il tuo file hosts abbia l'alias localhost.
Matt,

127.0.0.1 localhost è nel mio file hosts.
dcolumbus,

Apri il prompt dei comandi e digita ping localhoste vedi cosa dice.
Steve Robbins,

64 byte da 127.0.0.1: icmp_seq = 0 ttl = 64 tempo = 0.100 ms 64 byte da 127.0.0.1: icmp_seq = 1 ttl = 64 tempo = 0.102 ms 64 byte da 127.0.0.1: icmp_seq = 2 ttl = 64 tempo = 0.096 ms
dcolumbus,

Risposte:


26

MySQL proverà a connettersi al socket unix se gli dici di connettersi a "localhost". Se gli dici di connettersi a 127.0.0.1, lo stai forzando a connettersi alla presa di rete. Quindi probabilmente MySQL è configurato per ascoltare solo il socket di rete e non il socket del file system.

Cosa è esattamente sbagliato nel socket unix è difficile da dire. Ma ti consiglio di leggere questa pagina nella guida di riferimento di MySQL. Questo dovrebbe aiutarti.

AGGIORNAMENTO: in base alla domanda aggiornata: il parametro "socket" dovrebbe essere simile al seguente: "/var/lib/mysql/mysql.sock". Questa pagina nel Manuale di riferimento contiene alcune informazioni aggiuntive.

Qui hai l'inizio del mio file /etc/my.cnf:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

Il tuo file dovrebbe essere simile. Quindi il tuo problema dovrebbe essere risolto. Non dimenticare di riavviare il server MySQL prima di testarlo.


1
Wow: "Un file socket Unix viene utilizzato se non si specifica un nome host o se si specifica il nome host speciale localhost." Sembra ... non intuitivo. Da qui tutte le altre risposte.
Mark Wagner,

Va bene sapere +1
Matt,

Apprezzo la teoria ... ma non so quale sia la risposta.
dcolumbus,

@dcolumbus: Come ho già scritto, è difficile da dire. Quello che posso consigliarti è aprire una console e scrivere semplicemente il comando "mysql". Forse allora otterrai maggiori informazioni. Un'altra cosa è esaminare il file di registro. Il mio si trova nella directory / var / log / e si chiama mysql.log. Il tuo potrebbe avere un altro nome o un'altra posizione. Se puoi fornirci ulteriori informazioni, probabilmente possiamo aiutarti meglio.
Raffael Luthiger,

2
php.ini ha riferimenti a "/var/mysql/mysql.sock" (3 posti per l'esattezza) che devono essere cambiati in "/tmp/mysql.sock" ... Grazie per il tuo aiuto!
dcolumbus,

8

Potresti avere IPv6 abilitato, il suo localhost molto possibile si risolve nel localhost ipv6, che non è definito nella tua configurazione msql.

Ho anche avuto un problema in cui ho dovuto aggiungere 'localhost' al posto di '127.0.0.1' alle sottoreti consentite per quell'utente, non capisco perché (stavo usando ipv4 ed era un po 'di tempo fa) ma vale la pena provare.


Puoi verificarlo vedendo se 'host localhost' dalla riga di comando restituisce :: 1 e 127.0.0.1. In tal caso, puoi rimuovere la mappatura :: 1 da / private / etc / hosts o riconfigurare MySQL per ascoltare l'indirizzo IPv6 :: 1 e 127.0.0.1
David North,

Penso di ricordare di aver letto da qualche parte che IPv6 è abilitato per impostazione predefinita su Mac OS X ... è così?
dcolumbus,

ipv6 è abilitato praticamente per tutti i moderni sistemi operativi in ​​questi giorni, sono su osx10.6 ed è abilitato di default.
Silverfire,

sbagliato. Localhost ha un significato speciale per i client mysql - controlla serverfault.com/a/295300/67675
poige

5

Per me, il php incorporato di OSX è configurato per utilizzare un socket unix diverso rispetto al mysql di homebrew. Quindi non può connettersi tramite localhost che utilizza quel socket.

L'ho risolto con un trucco rapido collegando in modo semplice il percorso socket configurato di php per indicare quello che mysql effettivamente utilizza.

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

I seguenti comandi diagnostici sono stati molto utili.

Controlla i percorsi socket predefiniti utilizzati da php e mysql:

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

Connetti usando una presa specificata:

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

Determinare quale tipo di client mysql socket sta utilizzando per connettersi:

lsof | egrep '^mysql .*(IPv|unix)'

2

Potresti controllare mysql/conf/my.conf(la struttura della directory dovrebbe essere praticamente la stessa su OSx) per vedere se skip-networkingè senza commento? In tal caso, aggiungi un #in-front della linea e riavvia il server mysql.

In realtà ho avuto un problema simile qualche tempo fa (anche se non era in OSx), quindi ho pensato che potesse valere la pena tentare.


1
Perché questo è stato sottoposto a downgrade? Una spiegazione sarebbe utile.
karllindmark,

Non ti ho votato in negativo, ma la tua risposta è in realtà l'opposto di ciò che l'OP sta chiedendo. Ma ti ho votato perché ho lottato con la condizione opposta: mi sarei collegato tramite una presa, ma NON tramite la rete. A proposito, NON POSSO RISOLVERE tramite my.conf; Ho dovuto inserirlo nella riga di comando: "mysqlf --skip_networking = 0 ..."
Jan Steinman

2

PHP sta ancora tentando di utilizzare la posizione predefinita del socket. Questo problema può apparire se la cartella MariaDB / MySQL è stata spostata da / var / lib / mysql in un'altra posizione. Per risolvere il problema devi definire la posizione del nuovo socket nel file /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

Attenzione, a seconda del driver utilizzato, potrebbe essere necessario specificare pdo_mysql.default_socket = !

Per controllare la tua directory corrente, esegui il seguente comando in mysql:

select @@datadir;


1

Sono stato in grado di ricreare i tuoi stessi sintomi sulla mia casella di test, spero che questo possa aiutare.

In MySQL, gli utenti sono definiti da due parti (nome e host). Per impostazione predefinita, MySQL avrà 3 utenti root:

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

Il campo della password sarà vuoto (nessuna password) o avrà un hash memorizzato. Se imposti la password per un utente specifico, non aggiorna automaticamente tutto, poiché MySQL li vede come utenti diversi.

Per esempio:

mysql> set password for 'root'@'127.0.0.1' = password('Password');

aggiornerà la password per 'root'@'127.0.0.1', ma non 'root'@'localhost'o'root'@'localhost.localdomain'

Dai un'occhiata alla skip_name_resolvevariabile:

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

L'impostazione predefinita skip_name_resolveè OFFe tenterà di risolvere tutti gli indirizzi IP in nomi host. Ad esempio, se ti connetti come 'root'@'127.0.0.1', MySQL cambierà connettiti come 'root'@'localhost'.

Se lo è ON, MySQL vedrà e si connetterà 'root'@'127.0.0.1'e 'root'@'localhost'come utenti separati. E possono avere o meno password diverse, a seconda di come sono state impostate.


Quindi, prima, vorrei controllare per vedere eventuali differenze di password: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

Se ci sono, puoi risolverli o puoi continuare a indagare.

Quindi vorrei controllare skip_name_resolve: mysql> show variables like 'skip_name_resolve';

In tal caso ON, vorrei scoprire dove viene impostato (ad esempio /etc/my.cnf) e rimuoverlo, a meno che non sia necessario.

Spero che questo ti aiuti!


1

Stavo avendo questo problema e non sono riuscito a capirlo. Ho provato tutto ciò che potevo bene senza alcun risultato.

Ho scoperto di avere un .netrc in / root / che conteneva informazioni.

L'ho eliminato e il problema è andato.

In grado di accedere a mysql usando mysql -uroot -p senza problemi ora.

So che questo è un vecchio post, ma spero che questo aiuti qualcuno.


1

Per me, modificando le autorizzazioni in modo che siano leggibili pubblicamente nella directory principale di mysql.sock, il problema è stato risolto:

chmod 755 /var/lib/mysql

1

Per le persone che usano CageFS con CloudLinux:

Ho ricreato /var/lib/mysqlperché stavo ricostruendo il server MySQL da zero ...

che ha smontato il percorso dalle gabbie. So che non è correlato, ma stavo usando cPanel e CloudLinux. Non sono riuscito a verificare il motivo per cui la connessione socket non funzionerà e, alla fine, ho capito.

aggiungendo /var/lib/mysqla /etc/cagefs/cagefs.mp (se già presente procedere al passaggio successivo) ed eseguendo

cagefsctl --remount-all

risolto il problema


1
OH MIO DIO! Questo è ciò che l'ha risolto per me! Era già in /etc/cagefs/cagefs.mpesecuzione ma funzionante cagefsctl --remount-allrisolto. Grazie uomo!
Alvaro Flaño Larrondo

0

devi definirlo in privato / etc / hosts penso ... o semplicemente usare 127.0.0.1 perché è comunque la stessa cosa, solo un alias.


127.0.0.1 localhost è nel mio file hosts.
dcolumbus,
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.