Ruby on Rails 3 OSX'te '/tmp/mysql.sock' soketi aracılığıyla yerel MySQL sunucusuna bağlanılamıyor


85

Standart bir Rails3 ortamım var, 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

rake db:migrateVeritabanı oluşturmak için çalışırken aldığım hata :

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

config / database.yml has

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

elbette, kaçırdığım basit bir şey.


1
Soket dosyası mevcut mu? Belki başka bir yerde mevcuttur (/var/lib/mysql/mysql.sock)?
Eimantas

Hayır, hiçbiri yok. Bir tane oluşturmayı deneyeceğim.
Jamie Buchanan

bu sorunların özü veya işletim sistemi düzeyinde ..
RGB

Yanıtlar:


212

İlk olarak, soket dosyanızı bulmak için:

mysqladmin variables | grep socket

Benim için bu şunu verir:

| socket                                            | /tmp/mysql.sock                                                                                                        |

Ardından, aşağıdakilere bir satır ekleyin config/database.yml:

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

17
Kök üzerinde bir şifreniz varsa, şunu yapın: "mysqladmin -pxxxx değişkenler | grep soket" burada xxxx kök şifrenizdir
Abe Petrillo

Bunun nasıl çalıştığı konusunda kafam karıştı; Listelediğiniz ilk komuta nereye / nasıl girersiniz? Bunu terminale mysqladmin: command not found
girdiğimde

2
Komutu herhangi bir klasöre girebilirsiniz. Command not foundmysql'in kurulu olmadığını gösterir.
Magne

2
Şifrem olmamasına rağmen yine de kullanıcıyı root olarak belirtmem gerekiyordu: mysqladmin -u kök değişkenler | grep socket
bkunzi01

1
@CodeBiker FYI: Linux kabukları, çalışma dizininden niteliksiz program adlarını çalıştırmama eğilimindedir (açıkça içinde olmadığı sürece PATH) - açık olmanız gerekir, örn ./program_name .... Bu, çalıştırılan gerçek programın onu nereden çalıştırmaya çalıştığınızdan bağımsız olma eğiliminde olduğu anlamına gelir.
mwfearnley

87

Buldum!

Rayların yerel soket yerine TCP / IP üzerinden bağlanmasını host: localhostsağlamak host: 127.0.0.1için config / database.yml'de değiştirin .

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

7
Mysql.sock dosya konumunu bulmak ve bu satırı config / database.yml'ye eklemek daha iyi olacaktır: "socket: /path/to/mysql.sock"
gparis

2
TCP / IP üzerinden bir soket kullanmanın faydası nedir? Üzgünüm - Rails ve Unix'te oldukça yeniyim
Jamie Buchanan

5
Unix soketlerinin TCP / IP soketlerinden daha az ek yükü vardır.
Tobias Cohen

1
Teşekkür ederim! Bu problemle Rails dışında (mysql gem kullanarak) karşılaştım ve bu çözüm işe yaradı. Kök erişimim yok, bu nedenle gem'i soket dosyası için başka bir konum kullanacak şekilde değiştiremiyorum. Bu numara baş ağrılarından kurtuldu.
Sojoodi

2
Bu cevap bana farklı bir şekilde yardımcı oldu. Rails uygulamamı bir dockerize mysql örneğine karşı çalıştırıyorum, localhost 3306 açık. Bu kurulumun bir yan etkisi, localhost aracılığıyla bağlanabilseniz bile, mysql aynı makinede değil, bir VM'de çalıştığı için yalnızca düşünce TCP'sini bağlayabilmenizdir - yani soket bağlantısı yoktur. Bunun yerine, burada yanıt Rails'in TCP kullanmasını zorunlu kılmaktır, çünkü ne yazık ki bulduğum daha iyi bir seçenek yok gibi görünüyor.
Brian

11

Mysql sunucunuz çalışmıyor olabilir. Aşağıda sunucunun nasıl başlatılacağı açıklanmaktadır. Bu, mysql indirmesiyle birlikte gelen README dosyasından bir alıntıdır.

Kurulumdan sonra, aşağıdaki komutları bir terminal penceresinde çalıştırarak MySQL'i başlatabilirsiniz. Bu görevi gerçekleştirmek için yönetici ayrıcalıklarına sahip olmanız gerekir.

Başlangıç ​​Öğesini kurduysanız, şu komutu kullanın:

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

Başlangıç ​​Öğesini kullanmıyorsanız, aşağıdaki komut sırasını girin:

 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)

Bu cevap, MAC'imde bu sorunu çözmeme yardımcı oldu ... bu yorumun neden daha yüksek sıralanmadığından emin değilim. Mysql'yi kurduğunuzda, konsolda görüntülenen bazı notlar vardır. Aşağıdaki komutları çalıştırmam gerekiyordu. 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

Servisin çalışmayı bırakması mümkündür, bu kesinlikle kontrol edilmesi gereken ilk şeydir.
Tass

8

Bu sorunu çözmek için seçenekler şunlardır:

Seçenek 1: Sunucunuzu 127.0.0.1 olarak değiştirin

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

Seçenek 2: MySql sunucunuza 2 bağlantınız var gibi görünüyor. Soket dosyası konumunuzu bulmak için şunu yapın:

mysqladmin variables | grep socket

benim için verir:

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!

veya

mysql --help 

PHP uygulaması için OS X Sürüm 10.9.5'e XAMPP yüklediğim için bu hatayı alıyorum. Burada varsayılan soket konumlarından birini seçin.

Varsayılan ray uygulamalarını seçiyorum:

socket: /tmp/mysql.sock

PHP uygulamalarım için XAMPP kuruyorum, böylece soketimi burada ayarlıyorum:

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

DİĞER OS X'te Soket Konumu

MAMPP için:

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

MySQL'den Paket Yükleyici için:

socket: /tmp/mysql.sock

Mac OS X Sunucusuyla Birlikte Verilen MySQL için:

socket: /var/mysql/mysql.sock

Ubuntu için:

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

Seçenek 3: Tüm bu ayarlar işe yaramazsa, soket konumunuzu kaldırabilirsiniz:

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

Umarım bu sana yardımcı olur.


Bu komutun güzel açıklaması: socket: /var/run/mysqld/mysql.sockbenim için çalıştı
Yonela Nuba

6

MySQL sunucusunu başlattığınızda "/tmp/mysql.sock" otomatik olarak oluşturulacaktır. Bu yüzden, rails sunucusunu başlatmadan önce bunu yapmayı unutmayın.


3

OSX üzerine MAMP kurulumumla MySQL soketi şu konumda bulunuyor /Applications/MAMP/tmp/mysql/mysql.sock. Kullandığım locate mysql.sockbenim MySQL soket yerini bulmak için.

Yani benim config/database.ymlgörünüşüm:

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

3

Mac OSX kullanıyorsanız,

MySQL Unix soketinin varsayılan konumu, seçtiğiniz kurulum türüne bağlı olarak Mac OS X ve Mac OS X Sunucusunda farklıdır.

Kurulum Türüne Göre Mac OS X'te MySQL Unix Soket Konumları

  • MySQL'den Paket Yükleyici ------------------ / tmp / mysql.sock

  • MySQL'den Tarball ------------------------------- / tmp / mysql.sock

  • MySQL, Mac OS X Sunucusuyla Birlikte Gelir ------- / var / mysql / mysql.sock

Dolayısıyla, sadece değiştirmek database.yml içinde socket: /tmp/mysql.sockkullandığınız işletim sistemine ve montaj tipi bağlı doğru yere noktasına


2

Mac OS X'te MySQL soketinin varsayılan konumu /var/mysql/mysql.sock.


1

Ben de aynı sorunu yaşadım, ancak cevapların hiçbiri yapmam gerekeni adım adım vermedi. Bu hata, soket dosyanızın henüz oluşturulmamış olması nedeniyle oluşur. Tüm yapman gereken:

  1. Mysql sunucunuzu başlatın, böylece sizin /tmp/mysql.sockyaratılır, bunu yapmak için çalıştırın:mysql server start
  2. Bu yapıldıktan sonra, uygulama dizininize gidin, config/database.ymldosyayı düzenleyin ve socket: /tmp/mysql.sockgirişi ekleyin / düzenleyin
  3. rake:dbmigrateBir kez daha koş ve her şey yolunda gitmeli

rake db:migrate*
Victor

0

Sorunun sadece bir üretim ortamım olması olduğunu buldum. Geliştirme veya test ortamım yok.

Komutu vermek için 'RAILS_ENV = üretim' ekleyerek

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

işe yaradı


0

MYSQL'i XAMPP üzerinden çalıştırıyorsanız:

  1. XAMPP mysql yapılandırma dosyasını açın (OSX'te):

    /Applications/XAMPP/etc/my.cnf

  2. Soket yolunu kopyalayın:

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

  3. Rails projesinin veritabanı yapılandırma dosyasını açın: myproject / config / database.yml

  4. Soket yapılandırmasını geliştirme veritabanı yapılandırmasına ekleyin:

->

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. Ray sunucusunu yeniden başlatın

Zevk almak :)


0

Şunun gibi bir sorununuz var: Yerel MySQL sunucusuna '/var/run/mysqld/mysqld.sock' soketi üzerinden bağlanamıyorsunuz

Ans: $ sudo service mysql start


0

Makinemde mysqld hizmeti durdu bu yüzden bana aynı sorunu veriyordu.

1: - Terminale gidin ve yazın

sudo service mysqld restart

Bu, mysqld hizmetini yeniden başlatacak ve gerekli konumda yeni bir çorap dosyası oluşturacaktır.


-1

MYSQL'i Ubuntu veya başka bir Linux üzerinde XAMPP veya LAMPP üzerinden çalıştırıyorsanız, şunu deneyin:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.