Ruby on Rails 3 Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo '/tmp/mysql.sock' na OSX


84

Mam standardowe środowisko Rails3, 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

Błąd jaki otrzymuję podczas uruchamiania rake db:migratebazy danych to:

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

config / database.yml ma

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

pewnie, że brakuje mi czegoś prostego.


1
Czy istnieje plik gniazda? Może jest obecny gdzie indziej (/var/lib/mysql/mysql.sock)?
Eimantas

Nie, nie istnieją. Spróbuję go stworzyć.
Jamie Buchanan

sedno tego problemu lub na poziomie systemu operacyjnego ..
RGB,

Odpowiedzi:


211

Najpierw, aby znaleźć plik gniazda:

mysqladmin variables | grep socket

Dla mnie to daje:

| socket                                            | /tmp/mysql.sock                                                                                                        |

Następnie dodaj linię do config/database.yml:

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

17
Jeśli masz hasło roota, zrób: "mysqladmin -pxxxx zmienne | gniazdo grep" gdzie xxxx to twoje hasło roota
Abe Petrillo

Nie wiem, jak to działa; gdzie / jak wpisujesz pierwsze polecenie, które wymieniłeś? Kiedy mysqladmin: command not found
wpisuję

2
Możesz wprowadzić polecenie w dowolnym folderze. Command not foundoznacza, że ​​nie masz zainstalowanego mysql.
Magne,

2
Mimo że nie miałem hasła, nadal musiałem określić użytkownika jako root: mysqladmin -u główne zmienne | grep socket
bkunzi01

1
@CodeBiker FYI: powłoki Linuksa zwykle nie wykonują niekwalifikowanych nazw programów z katalogu roboczego (chyba że jest to wyraźnie w PATH) - musisz być wyraźny, np ./program_name .... Oznacza to, że rzeczywisty wykonywany program jest zwykle niezależny od tego, skąd próbujesz go uruchomić.
mwfearnley

87

Znalazłem to!

Zmień host: localhostw config / database.yml, host: 127.0.0.1aby szyny łączyć się przez TCP / IP zamiast lokalnego gniazda.

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

7
Lepiej byłoby znaleźć lokalizację pliku mysql.sock i dodać tę linię do config / database.yml: "socket: /path/to/mysql.sock"
gparis

2
Jaka jest korzyść z używania gniazda przez TCP / IP? Przepraszam - jestem całkiem nowy w Railsach i Uniksie
Jamie Buchanan

5
Gniazda uniksowe mają mniejszy narzut niż gniazda TCP / IP.
Tobias Cohen

1
Dziękuję Ci! Natknąłem się na ten problem poza Railsami (używając mysql gem) i to rozwiązanie zadziałało. Nie mam uprawnień administratora, więc nie mogę zmodyfikować klejnotu, aby używał innej lokalizacji dla pliku gniazda. Ta sztuczka uratowała mi bóle głowy.
Sojoodi

2
Ta odpowiedź pomogła mi w inny sposób. Uruchamiam aplikację railsową na zdokeryzowanej instancji mysql, z ujawnionym localhost 3306. Jednym z efektów ubocznych tej konfiguracji jest to, że nawet jeśli możesz łączyć się przez localhost, możesz łączyć się tylko przez myśl TCP, ponieważ mysql działa na maszynie wirtualnej, a nie na tej samej maszynie - więc nie ma połączenia przez gniazdo. Zamiast tego odpowiedzią jest nakazanie Railsom używania TCP, ponieważ niestety nie ma lepszej opcji, którą znalazłem.
Brian

11

Twój serwer mysql może nie być uruchomiony. Poniżej wyjaśniono, jak uruchomić serwer. To jest fragment z pliku README, który jest dołączony do pobierania mysql.

Po instalacji możesz uruchomić MySQL, uruchamiając następujące polecenia w oknie terminala. Aby wykonać to zadanie, musisz mieć uprawnienia administratora.

Jeśli zainstalowałeś element startowy, użyj tego polecenia:

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

Jeśli nie używasz elementu startowego, wprowadź następującą sekwencję poleceń:

 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)

Ta odpowiedź pomogła mi rozwiązać ten problem na moim MAC ... nie wiem, dlaczego ten komentarz nie jest wyżej w rankingu. Po zainstalowaniu mysql w konsoli są wyświetlane notatki. Musiałem uruchomić następujące polecenia. unset TMPDIRand 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

Usługa może przestać działać, jest to zdecydowanie pierwsza rzecz do sprawdzenia.
Tass

8

Oto opcje rozwiązania tego problemu:

Opcja 1: zmień hosta na 127.0.0.1

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

Opcja 2: Wygląda na to, że masz 2 połączenia z serwerem MySql. Aby znaleźć lokalizację pliku gniazda, wykonaj następujące czynności:

mysqladmin variables | grep socket

dla mnie daje:

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!

lub

mysql --help 

Otrzymuję ten błąd, ponieważ zainstalowałem XAMPP w moim OS X w wersji 10.9.5 dla aplikacji PHP. Wybierz tutaj jedną z domyślnych lokalizacji gniazda.

Wybieram dla domyślnych aplikacji railsowych:

socket: /tmp/mysql.sock

W przypadku moich aplikacji PHP instaluję XAMPP, więc ustawiam tutaj gniazdo:

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

INNE Lokalizacja gniazda w OS X

Dla MAMPP:

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

Instalator pakietów z MySQL:

socket: /tmp/mysql.sock

Dla MySQL w pakiecie z Mac OS X Server:

socket: /var/mysql/mysql.sock

W przypadku Ubuntu:

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

Opcja 3: Jeśli wszystkie te ustawienia nie działają, możesz usunąć lokalizację gniazda:

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

Mam nadzieję, że to ci pomoże.


Ładne wyjaśnienie tego polecenia: socket: /var/run/mysqld/mysql.sockzadziałało dla mnie
Yonela Nuba

6

Plik „/tmp/mysql.sock” zostanie utworzony automatycznie po uruchomieniu serwera MySQL. Pamiętaj więc, aby to zrobić przed uruchomieniem serwera railsowego.


3

Przy mojej instalacji MAMP na OSX gniazdo MySQL znajduje się pod adresem /Applications/MAMP/tmp/mysql/mysql.sock. Kiedyś locate mysql.sockznajdowałem lokalizację mojego gniazda MySQL.

Więc mój config/database.ymlwygląd wygląda tak:

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

3

Jeśli korzystasz z Mac OSX,

Domyślna lokalizacja gniazda MySQL Unix różni się w systemach Mac OS X i Mac OS X Server w zależności od wybranego typu instalacji

Lokalizacje gniazd MySQL Unix w systemie Mac OS X według typu instalacji

  • Instalator pakietów z MySQL ------------------ / tmp / mysql.sock

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

  • MySQL w pakiecie z Mac OS X Server ------- / var / mysql / mysql.sock

Więc po prostu zmienić database.yml w socket: /tmp/mysql.sockpkt we właściwym miejscu w zależności od systemu operacyjnego i typu instalacji używasz


2

Domyślna lokalizacja gniazda MySQL w systemie Mac OS X to /var/mysql/mysql.sock.


1

Miałem ten sam problem, ale żadna z odpowiedzi nie wskazywała na krok po kroku tego, co musiałem zrobić. Ten błąd występuje, ponieważ plik gniazda nie został jeszcze utworzony. Wszystko co musisz zrobić to:

  1. Uruchom swój serwer mysql, aby /tmp/mysql.sockzostał utworzony, w tym celu uruchamiasz:mysql server start
  2. Gdy to zrobisz, przejdź do katalogu aplikacji, edytuj config/database.ymlplik i dodaj / edytuj socket: /tmp/mysql.sockwpis
  3. Uruchom rake:dbmigrateponownie i wszystko powinno działać dobrze

rake db:migrate*
Victor

0

Odkryłem, że problem polega na tym, że mam tylko środowisko produkcyjne. Nie mam środowiska programistycznego ani testowego.

Dodając „RAILS_ENV = produkcja”, aby wydać polecenie

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

zadziałało


0

Jeśli używasz MYSQL przez XAMPP:

  1. Otwórz plik konfiguracyjny XAMPP mysql (na OSX):

    /Applications/XAMPP/etc/my.cnf

  2. Skopiuj ścieżkę gniazda:

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

  3. Otwórz plik konfiguracyjny bazy danych projektu railsów: myproject / config / database.yml

  4. Dodaj konfigurację gniazda do konfiguracji programistycznej bazy danych:

->

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. Zrestartuj serwer szynowy

Cieszyć się :)


0

Masz z tym problem: nie można połączyć się z lokalnym serwerem MySQL przez gniazdo '/var/run/mysqld/mysqld.sock'

Odp: $ sudo service mysql start


0

Na moim komputerze usługa mysqld przestała działać, dlatego powodowała ten sam problem.

1: - Przejdź do terminala i wpisz

sudo service mysqld restart

Spowoduje to ponowne uruchomienie usługi mysqld i utworzenie nowego pliku sock w wymaganej lokalizacji.


-1

Jeśli używasz MYSQL przez XAMPP lub LAMPP na Ubuntu lub innym Linuksie, spróbuj:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.