Connessione MySQL non funzionante: 2002 Nessun file o directory di questo tipo


105

Sto cercando di configurare WordPress. Ho Apache e MySQL in esecuzione e gli account e il database sono tutti configurati. Ho provato a fare una semplice connessione:

<?php
    $conn = mysql_connect('localhost', 'USER', 'PASSWORD');
    if(!$conn) {
        echo 'Error: ' . mysql_errno() . ' - ' . mysql_error();
    }
?>

E ottengo sempre questo:

Errore: 2002 - Nessun file o directory di questo tipo

Di quale file o directory potrebbe parlare?

Sono su OS X Snow Leopard, utilizzando Apache integrato. Ho installato MySQL utilizzando x86_64 dmg.

AGGIORNAMENTO: ho scoperto che il socket è in /tmp/mysql.sock, quindi in php.ini, ho sostituito tutte le occorrenze del percorso sbagliato con quello.


2
per favore incolla l'output di /etc/init.d/mysql startse sei su una distribuzione base Debian. se fallisce, controlla il /etc/my.cnffile per il percorso corretto del file socket mysql.
settembre

4
risolto lo stesso problema su OS X con XAMPP utilizzando "127.0.0.1" al posto di "localhost".
Giuseppe Urso

Risposte:


96

Se usi Linux: il percorso del file mysql.sock è sbagliato. Questo di solito è perché stai usando (LAMPP) XAMPP e non è in /tmp/mysql.sock

Apri il file php.ini e trova questa riga:

mysql.default_socket

E fallo

mysql.default_socket = /path/to/mysql.sock

5
se non sei sicuro, prova /var/lib/mysql/mysql.sock come nuovo percorso per il socket.
Jay il

1
Hmm. Forse intendevano Leopard o Tiger. In ogni caso, divertiti con WordPress!
Alec Gorge

3
Nota Potrebbe essere necessario impostare mysqli.default_socket = /path/to/mysql.sock se il collegamento con mysqli
razzed

2
La posizione del socket predefinita per un'installazione di MySQL di serie è /tmp/mysql.sock.
Jonathon Hill

4
"Il nome host localhost ha un significato speciale. È vincolato all'uso di socket di dominio Unix. Non è possibile aprire una connessione TCP / IP utilizzando il nome host localhost, devi invece utilizzare 127.0.0.1." - php.net/manual/en/mysqli.quickstart.connections.php . Quindi fondamentalmente qualcosa non funziona con la connessione ai socket del dominio Unix che consentono localhostdi funzionare e TCP / IP funziona quindi cambiarlo nell'indirizzo TCP / IP 127.0.0.1funzionerà.
Edward

154

Ho avuto un problema simile e sono stato in grado di risolverlo indirizzando il mio mysql con 127.0.0.1invece di localhost.

Questo probabilmente significa che ho qualcosa di sbagliato nella configurazione dei miei host, ma questa soluzione rapida mi fa andare avanti adesso.


2
mi hai appena risparmiato del tempo prezioso.
uchamp

2
Ho controllato il mio file hosts e ho trovato una riga con code127.0.0.1 localhost code. Il che mi rende curioso di sapere perché la connessione tramite localhost non ha funzionato. Se qualcuno potesse illuminarmi sarei felice.
ola

2
Questo perché mysql.default_socket in php.ini è sbagliato. Esegui "php -i | grep mysql.default_socket"
Jonah

1
Questo ha funzionato per me, sono su el Capitan con mysql 5.7 installato tramite homebrew. Stavo provando a installare WP e quando ho cambiato "localhost" in "127.0.0.1" è stato in grado di connettersi.
dgig

5
"Il nome host localhost ha un significato speciale. È vincolato all'uso di socket di dominio Unix. Non è possibile aprire una connessione TCP / IP utilizzando il nome host localhost, devi invece utilizzare 127.0.0.1." - php.net/manual/en/mysqli.quickstart.connections.php . Quindi fondamentalmente qualcosa non funziona con la connessione ai socket del dominio Unix che consentono localhostdi funzionare e TCP / IP funziona quindi cambiarlo nell'indirizzo TCP / IP 127.0.0.1funzionerà.
Edward

39

Questo è per Mac OS X con l' installazione nativa di Apache HTTP e l'installazione personalizzata di MySQL .

La risposta si basa sull'eccellente risposta di @ alec-gorge, ma dal momento che ho dovuto cercare su Google alcune modifiche specifiche per averlo configurato nella mia configurazione, per lo più specifica per Mac OS X, ho pensato di aggiungerlo qui per completezza.

Abilita il supporto PHP5 per Apache HTTP

Assicurati che il supporto PHP5 sia abilitato in /etc/apache2/httpd.conf.

Modifica il file con sudo vi /etc/apache2/httpd.conf(inserisci la password quando richiesto) e decommenta (rimuovi ;dall'inizio) la riga per caricare il modulo php5_module .

LoadModule php5_module libexec/apache2/libphp5.so

Avvia Apache HTTP con sudo apachectl start(o restartse è già avviato e deve essere riavviato per rileggere il file di configurazione).

Assicurati che /var/log/apache2/error_logcontenga una riga che ti dica che php5_module è abilitato - dovresti vedere PHP/5.3.15(o simile).

[notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations

Ricerca del nome del file Socket

Quando MySQL è attivo e in esecuzione (con ./bin/mysqld_safe) dovrebbero essere stampate delle righe di debug sulla console che indicano dove trovare i file di registro. Nota il nome host nel nome del file - localhostnel mio caso - che potrebbe essere diverso per la tua configurazione.

Il file che viene dopo Logging toè importante. È lì che MySQL registra il suo lavoro.

130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'.
130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data

Apri il localhost.errfile (di nuovo, il tuo potrebbe avere un nome diverso), cioè tail -1 /Users/jacek/apps/mysql/data/localhost.errper scoprire il nome del file socket - dovrebbe essere l'ultima riga.

$ tail -1 /Users/jacek/apps/mysql/data/localhost.err
Version: '5.5.27'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

Nota la socket:parte: questo è il file socket che dovresti usare php.ini.

C'è un altro modo (alcuni dicono un modo più semplice) per determinare la posizione del nome del file del socket accedendo a MySQL ed eseguendo:

show variables like '%socket%';

Configurazione di PHP5 con supporto MySQL - /etc/php.ini

A proposito di php.ini ...

Nella /etcdirectory c'è il file /etc/php.ini.default . Copialo in /etc/php.ini .

sudo cp /etc/php.ini.default /etc/php.ini

Apri /etc/php.inie cerca mysql.default_socket .

sudo vi /etc/php.ini

L'impostazione predefinita mysql.default_socketè /var/mysql/mysql.sock. Dovresti cambiarlo con il valore che hai annotato in precedenza - era /tmp/mysql.socknel mio caso.

Sostituisci il /etc/php.inifile per riflettere il nome del file socket:

mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock

Verifica finale

Riavvia Apache HTTP.

sudo apachectl restart 

Controlla i log se non ci sono errori relativi a PHP5. Nessun errore significa che hai finito e PHP5 con MySQL dovrebbe funzionare bene. Congratulazioni!


Questa risposta aiuta
Vigneshwaran

Questa risposta è una schifezza. Non ha nulla a che fare con la domanda che viene posta ed è fondamentalmente solo un tutorial sull'amplificatore (acos), che - se buono - è ancora più sprecato se messo qui e non in un posto dove le persone che cercano effettivamente di impostare uno stack di amplificatori su macos stanno guardando. Per quanto riguarda la domanda che viene posta: questa risposta non spiega un cazzo sul motivo per cui si verifica l'errore e perché php cerca di connettersi tramite il socket invece del nome host, anche se viene passato a mysql_connect, che è il problema reale della domanda originale e non un generico malinteso sull'installazione del software.
ohcibi

@ohcibi ho scritto "Ho pensato di aggiungerlo qui per completezza." e ho pensato che sarebbe stato sufficiente (e visti i voti positivi ad alcune persone è piaciuto). Mi piace la tua idea di rendere la risposta più facile da trovare, ma non so come. Potresti condividere i tuoi pensieri e aiutarmi ... di nuovo? Grazie!
Jacek Laskowski

@ JacekLaskowski in generale: scrivi un post sul blog e commenta un link alla risposta accettata / più votata con la stessa intenzione che avevi qui ("aggiungila per completezza"). Ma proprio in questo thread non vedo nemmeno un motivo per pubblicare quel link. L'OP ha detto che sta usando macOS ma questo problema non ha niente a che fare con nessun sistema operativo ma con il modo di interpretare di mySQL localhost. Nessuno in cerca di aiuto per la configurazione di xamp su macos verrà qui tramite Google. Quindi ho usato il termine "merda". Questo thread non ha nulla a che fare con macos ma solo con mysql (nemmeno php).
ohcibi

14

La sostituzione di "localhost" con "127.0.0.1" nel file di configurazione (connessione db) ha aiutato!


1
ma perché dovrebbe essere aiutato?
Enamul Hassan

"Sostituzione di" localhost "con" 127.0.0.1 "o 127.0.0.1 nell'attuale indirizzo del server MySQL, ad esempio u55151.mysql.someserver.eu.
user2812532

13

Il riavvio del server mysql potrebbe aiutare. Nel mio caso, il riavvio del server ha consentito di risparmiare molto tempo.

service mysql restart

PS: utilizzo sudo service mysql restartper utenti non root.


2
È fantastico quando la soluzione semplice funziona davvero.
abalter

10

Innanzitutto, assicurati che MySQL sia in esecuzione. Comando: mysqld start

Se ancora non riesci a connetterti: che aspetto ha il tuo /etc/my.cnf? (o /etc/msyql/my.cnf)

Gli altri 2 post sono corretti in quanto è necessario controllare il socket perché 2002 è un errore del socket.

Un ottimo tutorial sulla configurazione di LAMP è: http://library.linode.com/lamp-guides/centos-5.3/index-print


Il programma di installazione non ha inserito un file my.cnf, tuttavia esiste un file /usr/local/mysql/mysql-test/include/default_my.cnf, dovrei copiarlo come my.cnf in /etc?
mk12

sì, ma potresti scoprire di aver bisogno di modificarlo in qualche modo.
Todd Moses,

7

Non che ti aiuti molto, ma nelle versioni recenti (e anche meno recenti ) di MySQL, il codice di errore 2002 significa "Impossibile connettersi al server MySQL locale tramite socket [nome del socket]", quindi questo potrebbe dirti un po 'di più.


1
Su OSX 10.9.x con MySQL 5.5.38 installato dalla sorgente, ricevevo questo errore. Questo suggerimento era corretto: si trattava di un problema di socket anche se mysqli_connect_errno () e mysqli_connect_error ()) dicevano che il file 2002 non è stato trovato. Sono stato in grado di risolvere questo problema modificando il mio /etc/php.ini e impostando mysql.default_socket E mysqli.default_socket per correggere il valore del socket (poiché la mia applicazione utilizzava mysqli per le connessioni)
Ronnie

7

Espandendo la risposta di Matthias D qui sono stato in grado di risolvere questo errore del 2002 sia su MySQL che su MariaDB con percorsi esatti utilizzando questi comandi:

Per prima cosa ottieni il percorso effettivo al socket MySQL:

netstat -ln | grep -o -m 1 '/.*mysql.sock'

Quindi ottieni il percorso PHP :

php -r 'echo ini_get("mysql.default_socket") . "\n";'

Usando l' output di questi due comandi , collegali:

sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock

Se ciò ritorna, No such file or directorydevi solo creare il percorso per PHP mysql.sock, ad esempio se il tuo percorso fosse, /var/mysql/mysql.sockdovresti eseguire:

sudo mkdir -p /var/mysql

Quindi prova di nuovo il comando sudo ln .


6

Controllerei il tuo file php.ini e verificherei che mysql.default_socket sia impostato correttamente e verificherei anche che il tuo mysqld sia configurato correttamente con un file socket a cui può accedere. L'impostazione predefinita tipica è "/tmp/mysql.sock".


Ok, dice /var/mysql/mysql.sock, ma quel percorso non esiste.
mk12

6

Ho riscontrato anche questo problema, quindi ho modificato "localhost" in "127.0.0.1", funziona.


6

nel mio caso ho problemi con mysqli_connect.
quando voglio connettermi
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () restituiscimi questo errore "Nessun file o directory di questo tipo"

questo ha funzionato per me mysqli_connect('localhost:3306', 'myuser','mypassword')


Questo ha funzionato bene per me; era la modifica di cui avevo bisogno per caricare il pacchetto delle statistiche sul football americano di Armchair Analysis in un'installazione Mysql locale di OS X. Grazie!
Michael Scott Cuthbert,

felice di sentirlo :)
masoud2011

4

L'errore 2002 significa che MySQL non può connettersi al server di database locale tramite il file socket (es /tmp/mysql.sock ).

Per scoprire dove si trova il tuo file socket, esegui:

mysql_config --socket

quindi ricontrolla che la tua applicazione utilizzi il file socket Unix corretto o connettiti tramite la porta TCP / IP.

Quindi ricontrolla se il tuo PHP ha la corretta configurazione del socket MySQL:

php -i | grep mysql.default_socket

e assicurati che il file esista .

Testare la presa:

mysql --socket=/var/mysql/mysql.sock

Se il socket Unix è sbagliato o non esiste, puoi collegarlo simbolicamente, ad esempio:

ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

o correggi il tuo file di configurazione (ad esempio php.ini).

Per testare la connessione PDO direttamente da PHP, puoi eseguire:

php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"

Controlla anche la configurazione tra Apache e CLI (interfaccia a riga di comando), poiché la configurazione può essere diversa.

È possibile che il server sia in esecuzione, ma si sta tentando di connettersi utilizzando una porta TCP / IP, una named pipe o un file socket Unix diverso da quello su cui il server è in ascolto. Per correggerlo è necessario invocare un programma client (ad esempio specificando --portun'opzione) per indicare il numero di porta corretto, o il file named pipe o socket Unix appropriato (ad esempio, --socketopzione).

Vedi: Risoluzione dei problemi di connessione a MySQL


Altre utilità / comandi che possono aiutare a tenere traccia del problema:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Usa XDebug con xdebug.show_exception_trace=1nel tuoxdebug.ini
  • Su OS X prova sudo dtruss -fn mysqld, su Linux esegui il debug constrace
  • Controlla i permessi sul socket Unix: stat $(mysql_config --socket)e se hai abbastanza spazio libero ( df -h).
  • Riavvia il tuo MySQL.
  • Controlla net.core.somaxconn.

3

Assicurati che il tuo server locale (MAMP, XAMPP, WAMP, ecc.) Sia in esecuzione.


Oltre a questo, se stai usando MAMP su MacOS (ovviamente!) Ricevi questo errore anche se accedi al tuo sito immediatamente dopo aver risvegliato il tuo Mac dalla sospensione. La soluzione, ovviamente, è semplicemente aspettare e riprovare. :-)
texelate

0

Ho avuto un problema simile.
Fondamentalmente qui il problema è che probabilmente ci sono due istanze di mysql in esecuzione.
A) Uno in esecuzione in /etc/init.d
B) Lampada installata in / opt / lamp
Soluzione:
Passaggio 1: - Trova tutte le istanze in esecuzione di mysql utilizzando commnad "find / | grep mysqld"
Passaggio 2: - Arresta i servizi in esecuzione su /etc/init.d utilizzando il servizio mysql stop
Passaggio 3: - Riavvia i servizi della lampada utilizzando / opt / lamp / lamp restart

Dovresti essere a posto :)


0

Su un Mac, prima di fare tutto il lavoro duro, controlla semplicemente le tue impostazioni System Preferences > MySQL. Il più delle volte, ho riscontrato che il team si è imbattuto in questo problema da allora The MySQL Server Instance is stopped.

Fai clic sul Start MySQL Serverpulsante e la magia avverrà.


0

Sto usando PHP-FPM o più versioni php nel mio server. Nel mio caso aggiorno il valore mysqli poiché non è presente il parametro socket predefinito mysql:

mysqli.default_socket

per :

mysql.default_socket = /path/to/mysql.sock

grazie a @Alec Gorge


0

Ho avuto lo stesso problema. Il mio socket è stato finalmente trovato in /tmp/mysql.sock. Poi ho aggiunto quel percorso a php.ini. Ho trovato il socket lì controllando la pagina "Server Status" in MySQL Workbench. Se il tuo socket non è in /tmp/mysql.sock, forse MySQL Workbench potrebbe dirti dove si trova? (Certo che usi MySQL Workbench ...)



0

Digital Ocean MySql 2002-nessun-tale-file-o-directory

Aggiungi questa fine del file /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Riavvia MySql

service mysql restart


-1

Ho avuto lo stesso problema anche su un server Linux. Ciò che mi ha aiutato è stato il comando " sudo reboot ", che viene utilizzato per riavviare il server Linux.


-2

abilitare e avviare il servizio mariadb

sudo systemctl abilita mariadb.service

sudo systemctl avvia mariadb.service

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.