Ruby on Rails 3 Es kann keine Verbindung zum lokalen MySQL-Server über den Socket '/tmp/mysql.sock' unter OSX hergestellt werden

84

Ich habe eine Standard-Rails3-Umgebung, 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

Fehler beim Ausführen rake db:migratezum Erstellen einer Datenbank ist:

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

config / database.yml hat

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

Sicher ist es etwas Einfaches, das mir fehlt.

Jamie Buchanan
quelle
1
Ist die Socket-Datei vorhanden? Vielleicht ist es woanders vorhanden (/var/lib/mysql/mysql.sock)?
Eimantas
Nein, weder existieren. Ich werde versuchen, eine zu erstellen.
Jamie Buchanan
der Kern dieser Probleme oder auf Betriebssystemebene ..
RGB

Antworten:

211

So finden Sie zunächst Ihre Socket-Datei:

mysqladmin variables | grep socket

Für mich bedeutet dies:

| socket                                            | /tmp/mysql.sock                                                                                                        |

Fügen Sie dann eine Zeile zu Ihrem hinzu config/database.yml:

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /tmp/mysql.sock
Tobias Cohen
quelle
17
Wenn Sie ein Passwort auf root haben, gehen Sie wie folgt vor: "mysqladmin -pxxxx variables | grep socket" wobei xxxx Ihr root-Passwort ist
Abe Petrillo
Ich bin verwirrt darüber, wie das funktioniert. Wo / wie geben Sie den ersten Befehl ein, den Sie aufgelistet haben? Wenn ich das in das Terminal mysqladmin: command not found
eingebe
2
Sie können den Befehl in einen beliebigen Ordner eingeben. Command not foundzeigt an, dass Sie MySQL nicht installiert haben.
Magne
2
Obwohl ich kein Passwort hatte, musste ich den Benutzer als root angeben: mysqladmin -u root variables | grep socket
bkunzi01
1
@CodeBiker FYI: Linux-Shells führen normalerweise keine unqualifizierten Programmnamen aus dem Arbeitsverzeichnis aus (es sei denn, sie befinden sich explizit im PATH) - Sie müssen explizit sein, z ./program_name .... Dies bedeutet, dass das tatsächlich ausgeführte Programm in der Regel unabhängig davon ist, von wo aus Sie es ausführen möchten.
mwfearnley
87

Fand es!

Ändern Sie host: localhostin config / database.yml, host: 127.0.0.1damit Rails über TCP / IP anstelle des lokalen Sockets verbunden werden.

development:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx
Jamie Buchanan
quelle
7
Es wäre besser, den Speicherort der Datei mysql.sock zu finden und diese Zeile zu config / database.yml hinzuzufügen: "socket: /path/to/mysql.sock"
gparis
2
Was ist der Vorteil der Verwendung eines Sockets über TCP / IP? Entschuldigung - ich bin ziemlich neu bei Rails und Unix
Jamie Buchanan
5
Unix-Sockets haben weniger Overhead als TCP / IP-Sockets.
Tobias Cohen
1
Danke dir! Ich bin auf dieses Problem außerhalb von Rails gestoßen (mit MySQL Gem) und diese Lösung hat funktioniert. Ich habe keinen Root-Zugriff, daher kann ich den Edelstein nicht so ändern, dass er einen anderen Speicherort für die Socket-Datei verwendet. Dieser Trick ersparte mir Kopfschmerzen.
Sojoodi
2
Diese Antwort hat mir auf andere Weise geholfen. Ich führe meine Rails-Anwendung gegen eine dockerisierte MySQL-Instanz aus, wobei localhost 3306 verfügbar ist. Ein Nebeneffekt dieses Setups ist, dass Sie, obwohl Sie eine Verbindung über localhost herstellen können, nur eine Verbindung zu TCP herstellen können, da MySQL auf einer VM und nicht auf demselben Computer ausgeführt wird - also keine Socket-Verbindung. Stattdessen ist es hier die Antwort, Rails die Verwendung von TCP zu beauftragen, da es leider keine bessere Option zu geben scheint, die ich gefunden habe.
Brian
11

Ihr MySQL-Server läuft möglicherweise nicht. Im Folgenden wird erläutert, wie Sie den Server starten. Dies ist ein Auszug aus der README-Datei, die mit dem MySQL-Download geliefert wird.

Nach der Installation können Sie MySQL starten, indem Sie die folgenden Befehle in einem Terminalfenster ausführen. Sie müssen über Administratorrechte verfügen, um diese Aufgabe ausführen zu können.

Wenn Sie das Startelement installiert haben, verwenden Sie diesen Befehl:

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

Wenn Sie das Startelement nicht verwenden, geben Sie die folgende Befehlssequenz ein:

 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)
suga_shane
quelle
Diese Antwort hat mir geholfen, dieses Problem auf meinem MAC zu beheben. Ich bin mir nicht sicher, warum dieser Kommentar nicht höher eingestuft ist. Wenn Sie MySQL installieren, werden einige Hinweise in der Konsole angezeigt. Ich musste die folgenden Befehle ausführen. unset TMPDIRund mysql_install_db --verbose --user=whoami` --basedir = "$ (brauen - Präfix mysql)" --datadir = / usr / local / var / mysql --tmpdir = / tmp ....then I had to start the server mysql.server start`
dmillion
Es ist möglich, dass der Dienst nicht mehr funktioniert. Dies ist definitiv das erste, was überprüft werden muss.
Tass
7

Dies sind Optionen, um dieses Problem zu beheben:

Option 1: Ändern Sie Ihren Host in 127.0.0.1

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

Option 2: Es scheint, als hätten Sie zwei Verbindungen zu Ihrem Server MySql. Gehen Sie folgendermaßen vor, um den Speicherort Ihrer Socket-Datei zu ermitteln:

mysqladmin variables | grep socket

für mich gibt:

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!

oder

mysql --help 

Ich erhalte diesen Fehler, weil ich XAMPP in meiner OS X Version 10.9.5 für PHP-Anwendung installiert habe. Wählen Sie hier einen der Standard-Socket-Speicherorte.

Ich wähle für Standard-Rails-Apps:

socket: /tmp/mysql.sock

Für meine PHP-Apps installiere ich XAMPP, also setze ich meinen Socket hier:

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

ANDERE Socket-Position in OS X.

Für MAMPP:

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

Für Package Installer von MySQL:

socket: /tmp/mysql.sock

Für MySQL, das mit Mac OS X Server gebündelt ist:

socket: /var/mysql/mysql.sock

Für Ubuntu:

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

Option 3: Wenn alle diese Einstellungen nicht funktionieren, können Sie Ihren Socket-Speicherort entfernen:

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

Ich hoffe das hilft dir.

Akbarbin
quelle
6

"/tmp/mysql.sock" wird automatisch erstellt, wenn Sie den MySQL-Server starten. Denken Sie also daran, dies zu tun, bevor Sie den Rails-Server starten.

Magne
quelle
3

Bei meiner Installation von MAMP unter OSX befindet sich der MySQL-Socket unter /Applications/MAMP/tmp/mysql/mysql.sock. Ich habe locate mysql.sockmeinen MySQL-Socket-Speicherort gefunden.

So config/database.ymlsieht mein aus:

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

Wenn Sie unter Mac OSX arbeiten,

Der Standardspeicherort für den MySQL Unix-Socket ist unter Mac OS X und Mac OS X Server je nach gewähltem Installationstyp unterschiedlich

MySQL Unix-Socket-Speicherorte unter Mac OS X nach Installationstyp

  • Paketinstallationsprogramm von MySQL ------------------ / tmp / mysql.sock

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

  • Mit Mac OS X Server gebündeltes MySQL ------- / var / mysql / mysql.sock

Also einfach Ihre ändern database.yml in socket: /tmp/mysql.sockdem richtigen Ort zu Punkt je nachdem , was O und Installationstyp Sie verwenden

Musili
quelle
2

Der Standardspeicherort für den MySQL-Socket unter Mac OS X ist /var/mysql/mysql.sock.

morgant
quelle
1

Ich hatte das gleiche Problem, aber keine der Antworten gab Schritt für Schritt Aufschluss darüber, was ich tun musste. Dieser Fehler tritt auf, weil Ihre Socket-Datei noch nicht erstellt wurde. Alles was du tun musst, ist:

  1. Starten Sie Ihren MySQL-Server, damit Ihr Server erstellt wird, damit Sie Folgendes /tmp/mysql.sockausführen können:mysql server start
  2. Sobald dies erledigt ist, gehen Sie zu Ihrem App-Verzeichnis und bearbeiten Sie die config/database.ymlDatei und fügen Sie den socket: /tmp/mysql.sockEintrag hinzu / bearbeiten Sie ihn
  3. Laufen Sie rake:dbmigratenoch einmal und alles sollte gut funktionieren
luizParreira
quelle
rake db:migrate*
Victor
0

Ich habe festgestellt, dass das Problem darin besteht, dass ich nur eine Produktionsumgebung habe. Ich habe keine Entwicklungs- oder Testumgebung.

Durch Hinzufügen von 'RAILS_ENV = Produktion', um den Befehl zu geben

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

es funktionierte

Paul Taylor
quelle
0

Wenn Sie MYSQL über XAMPP ausführen:

  1. Öffnen Sie die XAMPP-MySQL-Konfigurationsdatei (unter OSX):

    /Applications/XAMPP/etc/my.cnf

  2. Kopieren Sie den Socket-Pfad:

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

  3. Öffnen Sie die Datenbankkonfigurationsdatei des Rails-Projekts: myproject / config / database.yml

  4. Fügen Sie die Socket-Konfiguration zur Entwicklungsdatenbankkonfiguration hinzu:

->

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. Starten Sie den Rails-Server neu

Genießen :)

mpinvidio
quelle
0

Sie haben folgendes Problem: Es kann keine Verbindung zum lokalen MySQL-Server über den Socket '/var/run/mysqld/mysqld.sock' hergestellt werden.

Antwort: $ sudo service mysql start

Binni Bharadiya
quelle
0

Auf meinem Computer wurde der mysqld-Dienst gestoppt, weshalb ich das gleiche Problem hatte.

1: - Zum Terminal gehen und eingeben

sudo service mysqld restart

Dadurch wird der mysqld-Dienst neu gestartet und eine neue Sock-Datei am gewünschten Speicherort erstellt.

Nikhil Mohadikar
quelle
-1

Wenn Sie MYSQL über XAMPP oder LAMPP unter Ubuntu oder einem anderen Linux ausführen, versuchen Sie Folgendes:

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

Ahmad Kholil
quelle