Ruby on Rails 3 non può connettersi al server MySQL locale tramite socket '/tmp/mysql.sock' su OSX


84

Ho un ambiente Rails3 standard, RVM 1.2.9, Rails 3.0.5, Ruby 1.9.2p180, MySQL2 Gem 0.2.7, mysql-5.5.10-osx10.6-x86_64

L'errore che ricevo durante l'esecuzione rake db:migrateper creare il database è:

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

config / database.yml ha

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx

certo che mi manca qualcosa di semplice.


1
Il file socket è presente? Forse è presente da qualche altra parte (/var/lib/mysql/mysql.sock)?
Eimantas

No, nessuno dei due esiste. Proverò a crearne uno.
Jamie Buchanan

il nucleo di questi problemi oa livello di sistema operativo ..
RGB

Risposte:


211

Innanzitutto, per trovare il tuo file socket:

mysqladmin variables | grep socket

Per me, questo dà:

| socket                                            | /tmp/mysql.sock                                                                                                        |

Quindi, aggiungi una riga a config/database.yml:

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /tmp/mysql.sock

17
Se hai una password su root, fai: "mysqladmin -pxxxx variables | grep socket" dove xxxx è la tua password di root
Abe Petrillo

Sono confuso su come funziona; dove / come si inserisce il primo comando che hai elencato? Quando lo inserisco nel terminale, riporta:mysqladmin: command not found
CodeBiker

2
Puoi inserire il comando in qualsiasi cartella. Command not foundindica che non hai installato mysql.
Magne

2
Anche se non avevo la password, dovevo comunque specificare l'utente come root: mysqladmin -u root variables | grep socket
bkunzi01

1
@CodeBiker FYI: le shell Linux tendono a non eseguire nomi di programma non qualificati dalla directory di lavoro (a meno che non sia esplicitamente nella PATH) - devi essere esplicito, ad es ./program_name .... Ciò significa che il programma effettivo eseguito tende ad essere indipendente da dove si tenta di eseguirlo.
mwfearnley

87

Trovato!

Modificare host: localhostin config / database.yml per host: 127.0.0.1fare in modo che rails si connetta su TCP / IP invece che su socket locale.

development:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx

7
Sarebbe meglio trovare la posizione del file mysql.sock e aggiungere questa riga a config / database.yml: "socket: /path/to/mysql.sock"
gparis

2
Qual è il vantaggio di utilizzare un socket su TCP / IP? Mi dispiace - sono abbastanza nuovo per Rails e Unix
Jamie Buchanan

5
I socket Unix hanno meno overhead dei socket TCP / IP.
Tobias Cohen

1
Grazie! Mi sono imbattuto in questo problema al di fuori di Rails (usando mysql gem) e questa soluzione ha funzionato. Non ho accesso root, quindi non posso modificare la gem per utilizzare un'altra posizione per il file socket. Questo trucco mi ha salvato il mal di testa.
Sojoodi

2
Questa risposta mi ha aiutato in modo diverso. Sto eseguendo la mia applicazione rails su un'istanza mysql dockerized, con localhost 3306 esposto. Un effetto collaterale di questa configurazione è che anche se è possibile connettersi tramite localhost, è possibile connettersi solo al TCP pensiero poiché mysql è in esecuzione su una VM, piuttosto che sulla stessa macchina, quindi nessuna connessione socket. Al posto di questo, imporre a Rails di usare TCP è la risposta qui, perché purtroppo non sembra esserci un'opzione migliore che ho trovato.
Brian

11

Il tuo server mysql potrebbe non essere in esecuzione. Di seguito viene spiegato come avviare il server. Questo è un estratto dal file README fornito con il download di mysql.

Dopo l'installazione, puoi avviare MySQL eseguendo i seguenti comandi in una finestra di terminale. È necessario disporre dei privilegi di amministratore per eseguire questa attività.

Se hai installato l'elemento di avvio, utilizza questo comando:

 shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
 (ENTER YOUR PASSWORD, IF NECESSARY)
 (PRESS CONTROL-D OR ENTER "EXIT" TO EXIT THE SHELL)

Se non utilizzi l'elemento di avvio, inserisci la seguente sequenza di comandi:

 shell> cd /usr/local/mysql
 shell> sudo ./bin/mysqld_safe
 (ENTER YOUR PASSWORD, IF NECESSARY)
 (PRESS CONTROL-Z)
 shell> bg
 (PRESS CONTROL-D OR ENTER "EXIT" TO EXIT THE SHELL)

Questa risposta mi ha aiutato a risolvere questo problema sul mio MAC ... non sono sicuro del motivo per cui questo commento non è classificato più in alto. Quando installi mysql ci sono alcune note visualizzate nella console. Ho dovuto eseguire i seguenti comandi. unset TMPDIRe mysql_install_db --verbose --user=whoami` --basedir = "$ (brew --prefix mysql)" --datadir = / usr / local / var / mysql --tmpdir = / tmp ....then I had to start the server mysql.server start`
dmillion

È possibile che il servizio smetta di funzionare, questa è sicuramente la prima cosa da controllare.
Tass

8

Queste sono le opzioni per risolvere questo problema:

Opzione 1: cambia il tuo host in 127.0.0.1

staging:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx
  socket: your-location-socket

Opzione 2: sembra che tu abbia 2 connessioni al tuo server MySql. Per trovare la posizione del tuo file socket, fai questo:

mysqladmin variables | grep socket

per me dà:

mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock' exists!

o

mysql --help 

Ricevo questo errore perché ho installato XAMPP nella mia versione OS X 10.9.5 per l'applicazione PHP. Scegli una delle posizioni socket predefinite qui.

Scelgo per le app rails predefinite:

socket: /tmp/mysql.sock

Per le mie app PHP, installo XAMPP quindi imposto il mio socket qui:

socket: /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

ALTRI Socket Posizione in OS X

Per MAMPP:

socket: /Applications/MAMP/tmp/mysql/mysql.sock

Per Package Installer da MySQL:

socket: /tmp/mysql.sock

Per MySQL in bundle con Mac OS X Server:

socket: /var/mysql/mysql.sock

Per Ubuntu:

socket: /var/run/mysqld/mysql.sock

Opzione 3: se tutte queste impostazioni non funzionano, puoi rimuovere la posizione del socket:

staging:
  # socket: /var/run/mysqld/mysql.sock

Spero che questo ti sia d'aiuto.


Bella spiegazione di questo comando: ha socket: /var/run/mysqld/mysql.sockfunzionato per me
Yonela Nuba

6

"/tmp/mysql.sock" verrà creato automaticamente all'avvio del server MySQL. Quindi ricordati di farlo prima di avviare il server rails.


3

Con la mia installazione di MAMP su OSX, il socket MySQL si trova in /Applications/MAMP/tmp/mysql/mysql.sock. Ero solito locate mysql.socktrovare la posizione del mio socket MySQL.

Quindi il mio config/database.ymlaspetto è:

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /Applications/MAMP/tmp/mysql/mysql.sock

3

Se utilizzi Mac OSX,

La posizione predefinita per il socket MySQL Unix è diversa su Mac OS X e Mac OS X Server a seconda del tipo di installazione scelto

Posizioni dei socket MySQL Unix su Mac OS X per tipo di installazione

  • Installatore di pacchetti da MySQL ------------------ / tmp / mysql.sock

  • Tarball da MySQL ------------------------------- / tmp / mysql.sock

  • MySQL in bundle con Mac OS X Server ------- / var / mysql / mysql.sock

Quindi cambia il tuo database.yml in modo socket: /tmp/mysql.sockche punti al posto giusto a seconda del sistema operativo e del tipo di installazione che stai utilizzando


2

La posizione predefinita per il socket MySQL su Mac OS X è /var/mysql/mysql.sock.


1

Ho avuto lo stesso problema, ma nessuna delle risposte ha fornito un passo dopo passo di ciò che dovevo fare. Questo errore si verifica perché il tuo file socket non è stato ancora creato. Tutto quello che devi fare è:

  1. Avvia il tuo server mysql, quindi il tuo /tmp/mysql.sockè creato, per farlo esegui:mysql server start
  2. Una volta fatto, vai alla directory della tua app, modifica il config/database.ymlfile e aggiungi / modifica la socket: /tmp/mysql.sockvoce
  3. Corri rake:dbmigrateancora una volta e tutto dovrebbe funzionare bene

rake db:migrate*
Victor

0

Ho scoperto che il problema è che ho solo un ambiente di produzione. Non ho un ambiente di sviluppo o test.

Aggiungendo 'RAILS_ENV = production' per dare il comando

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

ha funzionato


0

Se stai eseguendo MYSQL tramite XAMPP:

  1. Apri il file di configurazione mysql di XAMPP (su OSX):

    /Applications/XAMPP/etc/my.cnf

  2. Copia il percorso del socket:

    socket = /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

  3. Apri il file di configurazione del database del progetto rails: myproject / config / database.yml

  4. Aggiungi la configurazione del socket alla configurazione del database di sviluppo:

->

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: difiuri_falcioni
  pool: 5
  username: root
  password:
  host: localhost
  socket: /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock
  1. Riavviare il server rails

Godere :)


0

Hai un problema in questo modo: Impossibile connettersi al server MySQL locale tramite il socket '/var/run/mysqld/mysqld.sock'

Risposta: $ sudo service mysql start


0

Sulla mia macchina il servizio mysqld si è fermato, ecco perché mi dava lo stesso problema.

1: - Vai al terminale e digita

sudo service mysqld restart

Ciò riavvierà il servizio mysqld e creerà un nuovo file calzino nella posizione richiesta.


-1

Se stai eseguendo MYSQL tramite XAMPP o LAMPP su Ubuntu o altro Linux, prova:

socket: /opt/lampp/var/mysql/mysql.sock

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.