Impossibile connettersi al server MySQL locale tramite socket '/var/mysql/mysql.sock' (38)


385

Sto riscontrando un grosso problema nel tentativo di connettermi a MySQL. Quando corro:

/usr/local/mysql/bin/mysql start

Ho il seguente errore:

Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38)

Ho mysql.socksotto la /var/mysqldirectory.

In /etc/my.cnfho:

[client]
port=3306
socket=/var/mysql/mysql.sock

[mysqld]
port=3306
socket=/var/mysql/mysql.sock
key_buffer_size=16M
max_allowed_packet=8M

e in /etc/php.iniho:

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
mysql.default_socket = /var/mysql/mysql.sock

Ho riavviato Apache utilizzando sudo /opt/local/apache2/bin/apachectl restart

Ma ho ancora l'errore.

Altrimenti, non so se sia rilevante, ma quando lo faccio mysql_config --socketsottengo

--socket         [/tmp/mysql.sock]

53
MySQL è in esecuzione?
David

2
Questo certamente spiega l'errore nel tentativo di connettersi ad esso. Come, come menzionato @Romain, c'è qualcosa nei log di MySQL (provare /var/log/mysqlo da qualche parte lì intorno) che indica perché non è in esecuzione? Viene visualizzato un errore quando si tenta di avviarlo?
David

5
Stavo ottenendo lo stesso errore, ma nel mio caso, ho scoperto che mysql non si avviava perché il disco era pieno al 100%. /var/log/mysqld.log è stato utile.
yellavon,

4
il motivo per cui chiedono se è in esecuzione, presumo, è perché il socket viene creato all'avvio del servizio. ho installato mysql, ma non ho mai avviato il servizio, quindi il file .sock non esiste. digita service mysqld startse hai appena installato. hth
changokun,

2
Di seguito la risposta di shimanyi sudo service mysql startmi ha salvato
Kiren Siva il

Risposte:


218

Se il tuo file my.cnf (di solito nella cartella / etc / mysql / ) è correttamente configurato con

socket=/var/lib/mysql/mysql.sock

puoi verificare se mysql è in esecuzione con il seguente comando:

mysqladmin -u root -p status

prova a cambiare il tuo permesso nella cartella mysql. Se lavori localmente, puoi provare:

sudo chmod -R 755 /var/lib/mysql/

quello ha risolto per me


11
Mi ha aiutato dopo aver seguito i passaggi precedenti e riavviato il mysqldservizio.
vortice

11
Sarebbe meglio se impostassi le autorizzazioni su 755 in modo che solo il proprietario della directory possa scriverle.
codewaggle

2
Il mio problema era in realtà solo che il mio volume di archiviazione per la mia app Web aveva esaurito lo spazio! Classico!
James T Snell,

3
Sul mio openSUSE 12.3, my.cnf è in / etc /.

dovremmo anche cambiare il permesso in /var/log/mysqld.log, grazie
Allahbakash.G

94

sei sicuro di aver installato mysql e mysql server ..

Ad esempio per installare il server mySql userò yum o apt per installare sia lo strumento da riga di comando mysql che il server:

yum -y install mysql mysql-server (or apt-get install mysql mysql-server)

Abilita il servizio MySQL:

/sbin/chkconfig mysqld on

Avviare il server MySQL:

/sbin/service mysqld start

successivamente imposta la password di root di MySQL:

mysqladmin -u root password 'new-password' (with the quotes)

Spero possa essere d'aiuto.


Ho usato l'homebrew e ha funzionato come un incantesimo:brew install mysql
JaKXz

2
Avevo già installato il client, il comando di cui avevo bisogno era sudo apt-get install mysql-serverallora la vita era buona
ErichBSchulz,

1
Non è l'uscita Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (38) dal cliente? È il client che tenta e non riesce a connettersi, giusto? (Penso che la domanda originale debba essere modificata per chiarire che).
msouth,

76

Una soluzione rapida che ha funzionato per me: prova a utilizzare l'indirizzo IP locale (127.0.0.1) anziché "localhost" in mysql_connect (). Questo "forza" php a connettersi tramite TCP / IP invece di un socket unix.


Ha funzionato ... ma perché? MySQL non si risolve localhoste ottiene 127.0.0.1comunque prima ancora di provare a connettersi?
Jaime Hablutzel,

3
no ... quando si utilizza localhost non si utilizza un socket Internet. Stai utilizzando un socket IPC. en.wikipedia.org/wiki/Unix_domain_socket . 127.0.0.1 è un loopback locale, il che significa che la richiesta non uscirà dal tuo computer ma utilizzerà TCP / IP in modo più lento ...
Master Yogurt

Funziona anche per me. Sono su Ubuntu 14.04, hhvm e nginx.
Maykonn,

1
Grazie. questo funziona per me, ma dalla risposta non mi è chiaro quale sia la soluzione
Nathan Buesgens,

Ciò è necessario anche quando ti connetti al server remoto attraverso un tunnel SSH
Tamm

51

Ho ricevuto il seguente errore

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

Ho provato diversi modi e alla fine l'ho risolto nel modo seguente

sudo gksu gedit /etc/mysql/my.cnf

modificato

#bind-address       = 127.0.0.1

per

bind-address        = localhost

e riavviato

sudo /etc/init.d/mysql restart

ha funzionato


Ho avuto un problema simile; si è trasferito da Ethernet (192.168.220.11) a Wi-Fi (192.168.220.12) ma aveva un indirizzo di bind codificato su IP Ethernet. Cambiando per localhostrisolverlo.
Chris G,

30

Assicurati di eseguire mysqld: /etc/init.d/mysql start


3
O sudo service mysql start|restartper Ubuntu.
Wtower,

18

Per evitare che si verifichi il problema, è necessario eseguire un arresto regolare del server dalla riga di comando anziché spegnere il server.

shutdown -h now

Ciò interromperà i servizi in esecuzione prima di spegnere la macchina.

Basato su Centos, un ulteriore metodo per ripristinarlo quando si verifica questo problema è spostare mysql.sock:

mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak

service mysqld start

Il riavvio del servizio crea una nuova voce chiamata mqsql.sock


14

Ho ricevuto questo errore quando ho impostato cron job per il mio file. Ho modificato le autorizzazioni del file su 777 ma non ha ancora funzionato per me. Finalmente ho ottenuto la soluzione. Può essere che sarà utile per gli altri.

Prova con questo comando:

mysql -h 127.0.0.1 -P 3306 -u root -p

Ricorda che -h significa host , -P significa port e -p significa password.


Forzare una connessione su TCP / IP invece di utilizzare un socket è inefficiente (e richiede l'attivazione del supporto TCP / IP localhost nel server, come da questa risposta precedente ). La risposta accettata dal 2011 è migliore: configura il server in modo da poter utilizzare correttamente un socket.
Quentin,

10
-pnon significa porta , significa password , l'hai confusa con-P
Quentin

Questa sembra essere, più o meno, una copia di questa precedente risposta
Quentin,

Per me era solo una questione di definire l'host corretto: mysql -h 127.0.0.1 -u root -p
kghbln

12

Come si può vedere dalle molte risposte qui, ci sono molti problemi che possono causare questo messaggio di errore quando si avvia il servizio MySQL. Il fatto è che MySQL generalmente ti dirà esattamente cosa c'è che non va, se guardi solo il file di registro appropriato.

Ad esempio, su Ubuntu, dovresti controllare /var/log/syslog. Dal momento che molte altre cose potrebbero anche essere la registrazione in questo file, probabilmente si desidera utilizzare grepper guardare i messaggi mysql e tailsolo i più recenti. Tutti insieme, potrebbe apparire come:

grep mysql /var/log/syslog | tail -50

Non apportare modifiche alla tua configurazione alla cieca perché qualcun altro ha detto "Ha funzionato per il mio sistema". Scopri cosa non va nel tuo sistema e otterrai risultati migliori molto più velocemente.


5
+1 Per fare un passo indietro e sottolineare qualcosa che molte delle altre risposte non riescono nemmeno a prendere in considerazione - vedere effettivamente ciò che l'applicazione potrebbe aver segnalato come un problema è un approccio molto migliore rispetto a correre ciecamente e apportare modifiche che potrebbero non anche essere applicabile ...!
SlySven

Ah, quindi sta usando l'errore .cnf. Questo lo spiega. Ora posso smettere di provare cose casuali e affrontare il problema reale. Grazie.
Synetech,

11

Un'altra soluzione alternativa è modificare /etc/my.cnf e includere l'host nella sezione [client]

 [client]
 #password       = your_password
 host            = 127.0.0.1
 port            = 3306
 socket          = /var/run/mysql/mysql.sock

E quindi riavviare il servizio mysql.

Questa soluzione alternativa è stata testata in: Versione server: 5.5.25a-log Distribuzione sorgente


si consiglia di aggiungere la sezione [client] se non già in my.cnf
Cris

7

Ho avuto lo stesso problema ed è stato causato da un aggiornamento dei driver mysql quando il server mysql era in esecuzione. L'ho risolto semplicemente riavviando sia mysql che apache2:

sudo service mysql stop

sudo service mysql start

sudo service apache2 stop

sudo service apache2 start


Nel mio caso, mysqlnon funzionava. Ho corso sudo service mysql startdopo l'esecuzione sudo service mysql statusper verificare che non fosse in esecuzione.
Tass

6

Nel mio caso, stavo usando Centos 5.5. Ho scoperto che il problema era dovuto al fatto che il servizio mysql era stato bloccato in qualche modo. Quindi ho avviato il servizio mysql con il comando:

 /etc/init.d/mysqld start

Quindi .. errore sciocco.


6

Se tutto ha funzionato bene e hai appena iniziato a vedere questo errore, prima di fare qualsiasi altra cosa, assicurati di non avere spazio su disco:

df -h

Se il volume in cui viene creato mysql.sock è al 100%, MySql non sarà in grado di crearlo e questa sarà la causa di questo errore. Tutto quello che devi fare è eliminare qualcosa che non è necessario, come i vecchi file di registro.



5
sudo service mysql start

Questo dovrebbe servirti bene. Potrebbe esserci la possibilità di modificare alcuni comandi che influiscono sulle configurazioni mysql.


o systemctl start mariadb.servicein Fedora 22 o RedHat 7. Successivamente è possibile impostare la password di root.
Junior Mayhé,

5

Esistono molte soluzioni a questo problema, ma per la mia situazione, avevo solo bisogno di correggere la DATA sulla macchina / server ( Ubuntu 16.04 Server ).

i) Controlla la data del tuo server e correggila.

ii) Esegui sudo /etc/init.d/mysql restart

Questo dovrebbe iniziare.


4

Stavo ottenendo l'errore perché stavo eseguendo MAMP e il mio file .sock si trovava in una posizione diversa. Ho appena aggiunto un link simbolico in cui l'app pensava che dovesse essere quella che indicava dove si trovava effettivamente e funzionava come un fascino.


come può aggiungere un collegamento simbolico nel punto in cui l'app pensava che dovesse essere quella che indicava dove si trovava effettivamente?
Gilberto Ibarra,

4

Ho anche scoperto che questo era un problema di autorizzazioni. Ho confrontato i file MySQL con un'installazione funzionante (entrambi su Debian 6 squeeze) e ho dovuto apportare le seguenti modifiche alla proprietà (dove si mydatabasetrovano tutti i database).

Proprietà mysql:mysql:

chown mysql:mysql /var/lib/mysql
chown mysql:mysql /var/lib/mysql/ib*
chown mysql:mysql /var/lib/mysql/mydatabase
chown mysql:mysql /var/lib/mysql/mydatabase/*
chown mysql:mysql /var/lib/mysql/mysql/* 

Proprietà mysql:root:

chown mysql:root /var/lib/mysql/mysql
chown mysql:root /var/run/mysqld 

Proprietà mysql:adm:

chown mysql:adm /var/log/mysql
chown mysql:adm /var/log/mysql.err
chown mysql:adm /var/log/mysql.log* 

4

Per me - questo è stato semplicemente un caso in cui MySQL impiegava molto tempo a caricarsi. Ho oltre 100.000 tabelle in uno dei miei database e alla fine è iniziato, ma ovviamente in questo caso deve impiegare molto tempo.


3

Se stai utilizzando la versione AWS (Amazon Web Services) Micro, si tratta di un problema di memoria. Quando ho corso

mysql

dal terminal direbbe

ERROR 2002 (HY000): Can't connect to local MySQL server through socket /var/run/mysqld/mysqld.sock' (111)

Quindi ho provato quanto segue e sarebbe fallito.

service mysqld restart

Dopo molte ricerche, ho scoperto che devi creare un file di scambio per MySQL per avere memoria sufficiente. Le istruzioni sono elencate: http://www.prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html .

Quindi, sono stato in grado di riavviare mysqld.


Ho avuto lo stesso problema sull'istanza "micro" del server AWS e posso confermare che rendendo il file di scambio DID corretto "ERRORE 2002 (HY000): Impossibile connettersi al server MySQL locale tramite socket / var / run / mysqld / mysqld .sock '(111) "problema. Grazie @ jth_92!
Konaras,

3

puoi sempre avviare il server mysql specificando la posizione del file mysql.sock usando l' --socketopzione like

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

Ciò funzionerà anche se la posizione del file socket è specificata in una posizione diversa nel file my.cnf.


3

Per coloro la cui soluzione non ha funzionato, provare:

cd /etc/mysql

controlla se my.cnf è presente

nano my.cnf

e assicurati di avere un solo indirizzo di bind come segue:

bind-address = 127.0.0.1

In caso contrario, questo potrebbe essere il problema, basta uscire da nano e salvare il file.

e service mysql start

nota che se non hai nano (è un editor di testo) basta installarlo con apt-get install nanoe una volta dentro premi Ctrl + X per uscire, non dimenticare di dire Y per salvare e usare lo stesso file)


Purtroppo questo non ha funzionato. Questo in pratica dice solo che solo il computer locale può accedere a mysql. Nessuna connessione remota.
stephen,

3

Ho avuto questo problema anche quando ho provato ad avviare il server, così tante delle risposte qui che dicono semplicemente di avviare il server non hanno funzionato. La prima cosa che puoi fare è eseguire quanto segue per vedere se ci sono errori di configurazione:

/usr/sbin/mysqld --verbose --help 1>/dev/null

Ho riscontrato un errore:

160816 19:24:33 [Note] /usr/sbin/mysqld (mysqld 5.5.50-0ubuntu0.14.04.1-log) starting as process 9461 ...
160816 19:24:33 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
160816 19:24:33 [Note] Plugin 'FEDERATED' is disabled.
160816 19:24:33 [ERROR] /usr/sbin/mysqld: unknown variable 'innodb-online-alter-log-max-size=4294967296'
160816 19:24:33 [ERROR] Aborting

Un semplice grep -HR "innodb-online-alter-log-max-size" /etc/mysql/ mi ha mostrato esattamente quale file conteneva la linea offensiva, quindi ho rimosso quella linea dal file.

Quindi, controllando il mio /var/log/mysql/error.logfile ho avuto:

InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 671088640 bytes!
160816 22:46:46 [ERROR] Plugin 'InnoDB' init function returned error.
160816 22:46:46 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160816 22:46:46 [ERROR] Unknown/unsupported storage engine: InnoDB
160816 22:46:46 [ERROR] Aborting

Sulla base di questa domanda la soluzione accettata non sarebbe lavoro perché non ho potuto anche ottenere il server incominciata ho seguito quello che alcuni dei commenti detto e cancellato la mia /var/lib/mysql/ib_logfile0e /var/lib/mysql/ib_logfile1file.

Ciò ha permesso l'avvio del server e sono stato in grado di connettermi ed eseguire query, tuttavia controllando il mio file di registro degli errori si stava rapidamente riempiendo con diverse decine di migliaia di linee come questa:

160816 22:52:15  InnoDB: Error: page 1415 log sequence number 82039318708
InnoDB: is in the future! Current system log sequence number 81640793100.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.

Sulla base di un suggerimento da qui , per risolvere il problema ho eseguito un mysqldump e ripristinato tutti i database (vedere il collegamento per diverse altre soluzioni).

$ mysqldump -u root -p --allow-keywords --add-drop-database --comments --hex-blob --opt --quote-names --databases db_1 db_2 db_3 db_etc > backup-all-databases.sql
$ mysql -u root -p < backup-all-databases.sql

Tutto sembra funzionare come previsto ora.


Il controllo mi ha /var/log/mysql/error.logaiutato nel mio caso. È stato [ERROR] Can't init tc logrisolto rapidamente utilizzando la seguente risposta: dba.stackexchange.com/a/185006/163583
Juraj.Lorinc

2

Aggiunta

--protocol=tcp 

all'elenco dei pramaters nella tua connessione ha funzionato per me.


2

Questo è stato abbastanza buono per me

sudo /etc/init.d/mysql restart

2

Ho riscontrato questo problema oggi. Nessuna di queste risposte ha fornito la correzione. Ho dovuto eseguire i seguenti comandi (disponibili qui https://stackoverflow.com/a/20141146/633107 ) per avviare il mio servizio mysql:

sudo /etc/init.d/mysql stop
cd /var/lib/mysql/
ls ib_logfile*
mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak
... etc ...
/etc/init.d/mysql restart

Ciò è stato in parte indicato dai seguenti errori in /var/log/mysql/error.log:

140319 11:58:21 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file ./ib_logfile0 is of different size 0 50331648 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
140319 11:58:21 [ERROR] Plugin 'InnoDB' init function returned error.
140319 11:58:21 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140319 11:58:21 [ERROR] Unknown/unsupported storage engine: InnoDB
140319 11:58:21 [ERROR] Aborting

Ho anche visto l'errore del disco pieno, ma solo quando si eseguono comandi senza sudo. Se il controllo delle autorizzazioni non riesce, segnala che il disco è pieno (anche quando la partizione non è nemmeno quasi piena).


2

CentOS 7, 64 bit. Nuova installazione.
Nel mio caso, l'errore è stato perché non avevo installato il server MySQL e il client MySQL corretti.
Utilizzando yum, ho rimosso mariadbed edizione mysql-community. Ho scaricato gli rpm per client e server dal sito Web ufficiale di MySQL e installato il server e il client.

Durante l'installazione del server, mi è stato mostrato un messaggio che la password per l'account root per MySQL era memorizzata in un file che potevo visualizzare sudo cat /root/.mysql_secret.

Quindi dopo aver installato il client e il server, ho verificato se MySQL funzionava (penso di aver riavviato prima di farlo) con il comando sudo service mysql statuse ho ottenuto il risultato.

MySQL in esecuzione (2601) [OK]

Mi sono collegato in MySQL utilizzando la password dal file .mysql_secret:
mysql -uroot -pdxM01Xfg3DXEPabpf. Si noti che dxM01Xfg3DXEPabpfè la password menzionata nel file .mysql_secret.

e quindi digitato immesso il seguente comando al prompt mysql per modificare la password di root:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('somePassword');

Da allora in poi tutto ha funzionato bene.


1
stesso caso su RHEL6U6 con versione Server: 5.6.23-enterprise-commercial-advanced.
L'HCD,

2
sudo service mysqld start

Ha funzionato per me, sto usando Centos


2

Questo non risponde direttamente alla tua domanda ma a un suo sottoinsieme, vale a dire l'utilizzo di PythonAnywhere. Continuavo a imbattermi in questa domanda quando cercavo una soluzione, quindi la aggiungo qui nella speranza che possa aiutare gli altri nella mia situazione.


PythonAnywhere ha deciso di modificare i nomi host della connessione al database per migliorare l'efficienza e l'affidabilità, come dettagliato qui :

Il nome host ufficiale si dovrebbe utilizzare per la connessione a un'istanza di database MySQL del tuo account è cambiato da mysql.server a yourusername .mysql.pythonanywhere-services.com . Questo elude una parte della nostra infrastruttura che ha iniziato a mostrare problemi nelle ultime settimane e dovrebbe essere molto più efficiente e affidabile rispetto al vecchio sistema.

Quindi, dovrai aggiornare il tuo nome host con il valore evidenziato sopra.



1

Ho avuto questo errore socket e sostanzialmente è dipeso dal fatto che MySQL non funzionava. Se si esegue una nuova installazione, assicurarsi di installare 1) il pacchetto di sistema e 2) il programma di installazione del pannello (mysql.prefPane). Il programma di installazione del pannello ti consentirà di accedere alle Preferenze di Sistema e aprire MySQL, quindi avviare un'istanza.

Nota che, su una nuova installazione, avevo bisogno di ripristinare il mio computer per rendere effettive le modifiche. A seguito di un riavvio, ho avviato una nuova istanza ed è stato in grado di aprire una connessione a localhost senza problemi.

Inoltre, a quanto pare, avevo installato versioni precedenti di MySQL ma avevo rimosso il pannello, il che semplifica l'esecuzione di un'istanza di MySQL per gli utenti Mac.

Un buon collegamento per questo processo di reinstallazione: http://www.coolestguyplanettech.com/how-to-install-php-mysql-apache-on-os-x-10-6/

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.