Impossibile connettersi al server MySQL locale tramite socket '/tmp/mysql.sock


126

Quando ho tentato di connettermi a un server MySQL locale durante la mia suite di test, non riesce con l'errore:

OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

Tuttavia, sono sempre in grado di connettermi a MySQL eseguendo il mysqlprogramma da riga di comando . A ps aux | grep mysqlindica che il server è in esecuzione e stat /tmp/mysql.sockconferma che il socket esiste. Inoltre, se apro un debugger nella exceptclausola di tale eccezione, sono in grado di connettermi in modo affidabile con gli stessi parametri esatti.

Questo problema si riproduce in modo abbastanza affidabile, tuttavia non sembra essere al 100%, perché ogni volta in una luna blu, la mia suite di test viene effettivamente eseguita senza colpire questo errore. Quando ho provato a correre con sudo dtrussesso non si è riprodotto.

Tutto il codice client è in Python, anche se non riesco a capire come sarebbe rilevante.

Il passaggio all'utilizzo dell'host 127.0.0.1produce l'errore:

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)

1
È possibile che tu stia in qualche modo colpendo il database con molte connessioni simultanee? Forse prova ad aumentare max_connectionsnel tuo file conf MySQL?
dgel

2
fa mysql -h 127.0.0.1il lavoro da linea di comando? Non sono così sicuro che il tuo server mysql stia effettivamente ascoltando su una porta TCP.
Eli,

1
Sei sicuro di avere le versioni giuste delle librerie client Python MySQL per la tua versione di MySQL? Inoltre, mysql -h localhostfunziona in modo affidabile?
Old Pro

2
MySQL registra qualcosa nel registro errori? Inoltre, controlla le autorizzazioni dei file su /tmp/mysql.sock e sulla tua directory di dati mysql. Gli errori si verificano anche se si esegue la suite di test come root (sudo)?
Erik Cederstrand,

2
Molti di questi suggerimenti sono coperti dal manuale di riferimento ufficiale di MySQL a cui faccio riferimento nella mia risposta di seguito. È un uso migliore del tempo per esaminare sistematicamente i suggerimenti del manuale di riferimento di MySQL, piuttosto che provare solo uno o due di questi suggerimenti.
ottobre

Risposte:


152
sudo /usr/local/mysql/support-files/mysql.server start 

Questo ha funzionato per me. Tuttavia, se questo non funziona, assicurati che mysqld sia in esecuzione e prova a connetterti.


1
Ho trascorso più di 2 settimane (nemmeno scherzando) e questo è il più vicino a cui finalmente sono riuscito a connettermi. È comunque bloccato sull'avvio di mysql ..... Ma grazie, bel post!
L. Klotz,

2
sudo: /usr/local/mysql/support-files/mysql.server: comando non trovato. perché?
Syam Pillai,

1
Perché un colon dopo sudo? Controlla se il percorso esiste
Pratyay,

Oppure, se mysql è installato con homebrew: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren

1
Il server si è chiuso senza aggiornare il file PID (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid).
saran3h,

89

La sezione pertinente del manuale di MySQL è qui . Vorrei iniziare seguendo i passaggi di debug elencati qui.

Inoltre, ricorda che localhost e 127.0.0.1 non sono la stessa cosa in questo contesto:

  • Se l'host è impostato su localhost, viene utilizzato un socket o pipe.
  • Se l'host è impostato su 127.0.0.1, il client è costretto a utilizzare TCP / IP.

Quindi, ad esempio, è possibile verificare se il database è in attesa di connessioni TCP vi netstat -nlp. Sembra probabile che stia ascoltando le connessioni TCP perché dici che mysql -h 127.0.0.1funziona bene. Per verificare se è possibile connettersi al database tramite socket, utilizzare mysql -h localhost.

Se nulla di tutto ciò aiuta, allora probabilmente dovrai pubblicare maggiori dettagli sulla tua configurazione MySQL, esattamente come stai istanziando la connessione, ecc.


Sebbene in generale seguire le procedure diagnostiche stabilite sia una buona idea, se leggi la domanda (e le procedure) vedi che le procedure sono state seguite e hai stabilito che questo non è un problema con il server MySQL. Questo ha qualcosa a che fare specificamente con il client Python poiché tutti gli altri accessi attraverso il socket funzionano bene, incluso altri accessi da Python.
Old Pro

1
Che strano voto negativo. Ho pubblicato la procedura stabilita per diversi motivi: (1) altre persone stavano pubblicando solo una parte della procedura stabilita ed è meglio essere sistematici sul debug, (2) sembrava esserci una certa confusione su localhost vs 127.0.0.1 e (3 ) altre persone con lo stesso sintomo "Impossibile connettersi al server mysql locale" potrebbero inciampare in questa domanda. Sono consapevole che è probabilmente il client Python, motivo per cui ho chiesto ulteriori informazioni, ad esempio su come viene istanziata la connessione.
ottobre

3
+1 Stavo ricevendo questo errore cercando di connettermi a mysql attraverso un tunnel ssh (usando localhostcome host). Cambiando per 127.0.0.1risolverlo.
Krock

Per la cronaca, questo ha risolto il mio problema: "Impossibile connettersi al server MySQL locale tramite socket '/tmp/mysql.sock'".
proinsias

Grazie! ha funzionato per me questa correzione mentre cercavo di connettermi a un container maridb docker.
Lucian Oprea,

86

Per me il problema era che non stavo eseguendo il server mysql. Eseguire prima il server, quindi eseguirlo mysql.

$ mysql.server start
$ mysql -h localhost -u root -p

28

L'ho visto accadere nel mio negozio quando i miei sviluppatori hanno installato uno stack manager come MAMP che viene preconfigurato con MySQL installato in un posto non standard.

al tuo terminal

mysql_config --socket

che ti darà il tuo percorso per il file calzino. prendi quel percorso e usalo nel tuo parametro DATABASES HOST.

Quello che devi fare è puntare il tuo

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '',
    },
}

NOTA

esegui anche which mysql_configse in qualche modo hai istanze multiple di mysql server installate sul computer, potresti essere connesso a quello sbagliato.


Cosa succede se manca il file del calzino?
AlxVallejo,

comprare un altro paio? j / k significa che il servizio mysql non è in esecuzione. avvia / riavvia il tuo mysql
Francis Yaconiello il

6
Nel mio caso, la modifica dell'HOST da "localhost" a "127.0.0.1" ha risolto il problema.
lucaswxp,

@lucaswxp: Nel mio caso devo cambiare localhost con il nome di dominio
Anshul Mishra,

19

Ho appena cambiato il HOSTda localhosta 127.0.0.1e funziona benissimo:

# settings.py of Django project
...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
},
...

4
Sarebbe bello sapere quale file è stato modificato e dove si trova
Empi,

1
Nel settings.pyprogetto.
Sirbito X,

11

Quando, se perdi il tuo demone mysql in mac OSx ma è presente in un altro percorso, ad esempio in private / var, esegui il comando seguente

1)

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

2) riavvia la tua connessione a mysql con:

mysql -u username -p -h host databasename

funziona anche per mariadb


9

Esegui il cmd in basso nel terminale

/ Usr / local / mysql / bin / mysqld_safe

inserisci qui la descrizione dell'immagine

Quindi riavviare la macchina per rendere effettive. Funziona!!


1
Questo ha funzionato per me su un iMac con High Sierra che era stato aggiornato a Mojave. Quello che deve essere successo è stato che il file mysql.sock era stato in tmp ed era stato eliminato durante l'aggiornamento. Poiché il socket viene creato automaticamente all'avvio di MySQL, devi solo assicurarti che MySQL sia spento e quindi avviarlo in modalità provvisoria, come sopra. Il file mysql.sock appare magicamente.
David,

8

Controlla il numero di file aperti per il processo mysql usando il comando lsof.

Aumenta il limite dei file aperti ed esegui di nuovo.


l'ho già incontrato prima, e non puoi farlo solo tramite il tuo file .cnf. potrebbe essere necessario ulimitaumentare il numero di file aperti consentiti da client e server. se sei su una versione recente di Ubuntu questo potrebbe richiedere la modifica dello script upstart mysql in / etc / init ma spero che tu possa farlo nel file .cnf.
underrun

8

Dopo aver provato alcune di queste soluzioni e non aver avuto alcun successo, questo è ciò che ha funzionato per me:

  1. Riavvia il sistema
  2. mysql.server start
  3. Successo!

7

Questo potrebbe essere uno dei seguenti problemi.

  1. Blocco mysql errato. soluzione: devi trovare il socket mysql corretto da,

mysqladmin -p variabili | presa grep

e poi inseriscilo nel tuo codice di connessione db:

pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")

/tmp/mysql.sock è il reso da grep

2.Soluzione errata della porta mysql: devi scoprire la porta mysql corretta:

mysqladmin -p variables | grep port

e poi nel tuo codice:

pymysql.connect(db='db', user='user', passwd='pwd', host='localhost', port=3306)

3306 è la porta restituita dal grep

Penso che la prima opzione risolverà il tuo problema.


6

Per coloro che hanno eseguito l'aggiornamento da 5,7 a 8,0 tramite homebrew, questo errore è probabilmente causato dal mancato aggiornamento. Nel mio caso, mysql.server startmi è arrivato il seguente errore:

ERRORE! Il server si è chiuso senza aggiornare il file PID

Ho quindi controllato il file di registro tramite cat /usr/local/var/mysql/YOURS.err | tail -n 50e ho trovato quanto segue:

InnoDB: l'aggiornamento dopo un arresto anomalo non è supportato.

Se ci si trova sulla stessa barca, installare prima mysql@5.7tramite homebrew, arrestare il server, quindi riavviare il sistema 8.0.

brew install mysql@5.7

/usr/local/opt/mysql@5.7/bin/mysql.server start
/usr/local/opt/mysql@5.7/bin/mysql.server stop

Poi,

mysql.server start

Ciò ripristinerebbe il funzionamento di MySQL (8.0).


Ricevo di ERROR! The server quit without updating PID filenuovo lo stesso .
awebartisan,

Nel mio caso ho appena installato mysql@5.7 e rimosso l'ultima volta. Tutto è iniziato. Nessun database cancellato.
Andrew Luca,

4

Penso di aver visto questo stesso comportamento qualche tempo fa, ma non ricordo i dettagli.
Nel nostro caso, il problema era il momento in cui testrunner inizializza le connessioni al database relative alla prima interazione con il database richiesta, ad esempio, importando un modulo in settings.py o alcuni __init__.py. Proverò a cercare altre informazioni, ma questo potrebbe già suonare un campanello per il tuo caso.


4

Assicurati che il tuo / etc / hosts ci sia 127.0.0.1 localhostdentro e che funzioni bene


Sorprendentemente (per quanto riguarda) questo ha risolto il problema per me - controllando questo ho scoperto che durante il tentativo di configurare webdav Mavericks aveva aggiunto alcune righe (totalmente confuse) al mio file host - incluso uno che ha riassegnato localhost.
rob_was_taken,

4

Ho due congetture subdole su questo

CONIEZIONE # 1

Cerca la possibilità di non poter accedere al /tmp/mysql.sockfile. Quando installo i database MySQL, di solito faccio entrare il sito del file socket /var/lib/mysql. Se si root@localhostaccede a mysql come , la sessione del sistema operativo deve accedere alla /tmpcartella. Assicurarsi che /tmpdisponga dei diritti di accesso corretti nel sistema operativo. Inoltre, assicurati che l'utente sudo possa sempre leggere il file /tmp.

CONIEZIONE # 2

Accesso a mysql tramite 127.0.0.1 può causare confusione se non si presta attenzione. Come?

Dalla riga di comando, se ci si connette a MySQL con 127.0.0.1, potrebbe essere necessario specificare il protocollo TCP / IP.

mysql -uroot -p -h127.0.0.1 --protocol=tcp

o prova il nome DNS

mysql -uroot -p -hDNSNAME

Questo eviterà l'accesso come root@localhost, ma assicurati di averlo root@'127.0.0.1'definito.

La prossima volta che ti connetti a MySQL, esegui questo:

SELECT USER(),CURRENT_USER();

Cosa ti dà questo?

  • USER () riporta come hai tentato di autenticarti in MySQL
  • CURRENT_USER () riporta come ti è stato permesso di autenticarti in MySQL

Se queste funzioni ritornano con gli stessi valori, allora ti stai connettendo e autenticando come previsto. Se i valori sono diversi, potrebbe essere necessario creare l'utente corrispondente root@127.0.0.1.



3

se ricevi un errore come di seguito:

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

Quindi trova il percorso del tuo file mysqld.sock e aggiungilo a "HOST".

Come se stessi usando xampp su Linux, quindi il mio mysqld.sockfile è in un'altra posizione. quindi non funziona per ' /var/run/mysqld/mysqld.sock'

DATABASES = {

    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'asd',
        'USER' : 'root',
        'PASSWORD' : '',
        'HOST' : '/opt/lampp/var/mysql/mysql.sock',
        'PORT' : ''
    }
}

2

Verifica che il tuo mysql non abbia raggiunto il numero massimo di connessioni o non sia in una sorta di ciclo di avvio, come accade abbastanza spesso se le impostazioni non sono corrette in my.cnf.

Usa ps aux | grep mysql per verificare se il PID sta cambiando.


2

Mi sono guardato intorno online troppo a lungo per non contribuire. Dopo aver provato a digitare il prompt mysql dalla riga di comando, continuavo a ricevere questo messaggio:

ERRORE 2002 (HY000): impossibile connettersi al server MySQL locale tramite socket '/tmp/mysql.sock' (2)

Ciò era dovuto al fatto che il mio server mysql locale non era più in esecuzione. Per riavviare il server, sono passato a

shell> cd /user/local/bin

dove si trovava il mio mysql.server. Da qui, digita semplicemente:

shell> mysql.server start

Ciò riavvierà il server mysql locale.

Da lì puoi reimpostare la password di root se necessario.

mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
->                   WHERE User='root';
mysql> FLUSH PRIVILEGES;

2

Ho dovuto eliminare tutte le istanze di mysql trovando prima tutti gli ID di processo:

ps aux | grep mysql

E poi ucciderli:

kill -9 {pid}

Poi:

mysql.server start

Ha funzionato per me.


1

Il socket si trova in / tmp. Sul sistema Unix, a causa di modalità e proprietà su / tmp, ciò potrebbe causare qualche problema. Ma, finché ci dici che PUOI usare normalmente la tua connessione mysql, suppongo che non sia un problema sul tuo sistema. Un controllo fondamentale dovrebbe essere quello di spostare mysql.sock in una directory più neutrale.

Il fatto che il problema si verifichi "casualmente" (o non ogni volta) mi fa pensare che potrebbe trattarsi di un problema del server.

  • Il tuo / tmp si trova su un disco standard o su un supporto esotico (come nella RAM)?

  • Il tuo / tmp è vuoto?

  • Ti iotopmostra qualcosa di sbagliato quando riscontri il problema?


0

Configurare la connessione DB nella finestra di dialogo "Gestisci connessioni DB". Seleziona 'Standard (TCP / IP)' come metodo di connessione.

Vedi questa pagina per maggiori dettagli http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

Secondo questa altra pagina viene utilizzato un file socket anche se si specifica localhost.

Un file socket Unix viene utilizzato se non si specifica un nome host o se si specifica il nome host speciale localhost.

Mostra anche come verificare sul server eseguendo questi comandi:

Se è in esecuzione un processo mysqld, puoi verificarlo provando i seguenti comandi. Il numero di porta o il nome del file socket Unix potrebbe essere diverso nella configurazione. host_ip rappresenta l'indirizzo IP della macchina su cui è in esecuzione il server.

shell> mysqladmin version 
shell> mysqladmin variables 
shell> mysqladmin -h `hostname` version variables 
shell> mysqladmin -h `hostname` --port=3306 version 
shell> mysqladmin -h host_ip version 
shell> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

0

in ubuntu14.04 puoi farlo per risolvere questo problema.

zack@zack:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket**
Enter password: 
| socket                                            | ***/var/run/mysqld/mysqld.sock***                                                                                            |
zack@zack:~/pycodes/python-scraping/chapter5$***ln -s  /var/run/mysqld/mysqld.sock /tmp/mysql.sock***
zack@zack:~/pycodes/python-scraping/chapter5$ ll /tmp/mysql.sock 
lrwxrwxrwx 1 zack zack 27 11 29 13:08 /tmp/mysql.sock -> /var/run/mysqld/mysqld.sock=

0

Per me, sono sicuro che mysqld sia avviato e la riga di comando mysql può funzionare correttamente. Ma il server httpd mostra il problema (impossibile connettersi a mysql tramite socket).

Ho avviato il servizio con mysqld_safe &.

Alla fine, ho scoperto che quando avvio il servizio mysqld con il servizio mysqld start, ci sono problemi (problema di autorizzazione selinux), e quando risolvo il problema selinux e avvio mysqld con "service mysqld start", il problema di connessione httpd scompare. Ma quando avvio mysqld con mysqld_safe &, mysqld può funzionare. (il client mysql può funzionare correttamente). Ma ci sono ancora problemi quando ci si connette con httpd.


0

Se è relativo al socket, leggi questo file

/etc/mysql/my.cnf

e vedere qual è la posizione del socket standard. È una linea come:

socket = /var/run/mysqld/mysqld.sock

ora crea un alias per la tua shell come:

alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"

In questo modo non hai bisogno dei privilegi di root.


0

Prova semplicemente a correre mysqld.

Questo era ciò che non funzionava per me su Mac. Se non funziona, prova /usr/local/var/mysql/<your_name>.erra vedere i log degli errori dettagliati.


0
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

Può essere utile


Come la risposta più importante "sudo /usr/local/mysql/support-files/mysql.server start", ma sistemi operativi diversi potrebbero avere un percorso diverso di "mysql.server". Quindi ho provato a scrivere una riga di comando che potrebbe essere utile in molti sistemi operativi.
陈 也在 哦

0

Utilizzo di MacOS Mojave 10.14.6 per MySQL 8.0.19 installato tramite Homebrew

  • Corse sudo find / -name my.cnf
  • File trovato su /usr/local/etc/my.cnf

Ha funzionato per un po ', quindi alla fine l'errore è tornato. Ho disinstallato la versione Homebrew di MySQL e installato il file .dmg direttamente da qui

Connettendosi felicemente da allora.


0

Nel mio caso ciò che ha aiutato è stato modificare il file /etc/mysql/mysql.conf.d/mysqld.cnfe sostituire la riga:

socket      = /var/run/mysqld/mysqld.sock

con

socket      = /tmp/mysql.sock

Quindi ho riavviato il server e ha funzionato bene. La cosa divertente è che se ho rimesso la linea com'era prima e ho riavviato funzionava ancora ..


0

Avevo affrontato un problema simile di recente. Sono andato attraverso molte risposte. L'ho fatto funzionare seguendo i passaggi.

  1. cambiare il percorso del socket in /etc/my.cnf (poiché ripetutamente ho riscontrato un errore con /tmp/mysql.sock) riferimento per cambiare il percorso del socket
  2. eseguire mysqld_safe per riavviare il server poiché è il modo consigliato di riavviare in caso di errori. riferimento a mysqld_safe

0

Per me, il server mysql non era in esecuzione. Quindi, ho avviato il server mysql

mysql.server start

poi

mysql_secure_installation

per proteggere il server e ora posso visitare il server MySQL attraverso

sudo mysql -uroot -p

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.