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.

Jamie Buchanan
źródło
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
Tobias Cohen
źródło
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
Jamie Buchanan
źródło
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)
suga_shane
źródło
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.

akbarbin
źródło
Ł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.

Magne
źródło
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
Brad Denver
źródło
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

Musili
źródło
2

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

morgant
źródło
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
luizParreira
źródło
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

Paul Taylor
źródł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ę :)

mpinvidio
źródło
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

Binni Bharadiya
źródło
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.

Nikhil Mohadikar
źródło
-1

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

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

Ahmad Kholil
źródło